CAS

Java并发编程面试题(2020最新版)

蹲街弑〆低调 提交于 2021-02-19 03:59:37
基础知识 并发编程的优缺点 为什么要使用并发编程(并发编程的优点) 充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升 方便进行业务拆分,提升系统并发能力和性能:在特殊的业务场景下,先天的就适合于并发编程。现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分 。 并发编程有什么缺点 并发编程的目的就是为了能提高程序的执行效率,提高程序运行速度,但是并发编程并不总是能提高程序运行速度的,而且并发编程可能会遇到很多问题,比如**:内存泄漏、上下文切换、线程安全、死锁**等问题。 并发编程三要素是什么?在 Java 程序中怎么保证多线程的运行安全? 并发编程三要素(线程的安全性问题体现在): 原子性:原子,即一个不可再被分割的颗粒。原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。 可见性:一个线程对共享变量的修改,另一个线程能够立刻看到。(synchronized,volatile) 有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序) 出现线程安全问题的原因: 线程切换带来的原子性问题 缓存导致的可见性问题

CAS单点登录(一):单点登录与CAS理论介绍

吃可爱长大的小学妹 提交于 2021-02-18 00:03:06
一、什么是单点登录(SSO)   单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录。   单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 二、web系统如何实现单点登录 目前已经有了成熟的单点登录实现方案,比如CAS,我们只要在web系统中应用单点登录方案CAS即可。(主要涉及到注册登录验证等模块的改动)。 三、什么是CAS   CAS (Central Authentication Service) 是耶鲁 Yale 大学发起的一个java开源项目,旨在为 Web应用系统提供一种可靠的 单点登录 解决方案( Web SSO ), CAS 具有以下特点: 开源的企业级单点登录解决方案; CAS Server 为需要独立部署的 Web 应用----一个独立的Web应用程序(cas.war)。 ; CAS Client 支持非常多的客户端 ( 指单点登录系统中的各个 Web 应用 ) ,包括 Java, .Net, PHP, Perl, 等。   CAS在2004年12月成立Jasig项目,所以也叫JA-SIG CAS。   官网1: https://apereo.github

高性能队列——Disruptor

余生长醉 提交于 2021-02-16 23:39:10
背景 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖。 目前,包括Apache Storm、Camel、Log4j 2在内的很多知名项目都应用了Disruptor以获取高性能。在美团技术团队它也有不少应用,有的项目架构借鉴了它的设计机制。本文从实战角度剖析了Disruptor的实现原理。 需要特别指出的是,这里所说的队列是系统内部的内存队列,而不是Kafka这样的分布式队列。另外,本文所描述的Disruptor特性限于3.3.4。 Java内置队列 介绍Disruptor之前,我们先来看一看常用的线程安全的内置队列有什么问题。Java的内置队列如下表所示。 队列 有界性 锁 数据结构 ArrayBlockingQueue bounded 加锁 arraylist LinkedBlockingQueue optionally-bounded 加锁 linkedlist ConcurrentLinkedQueue unbounded 无锁 linkedlist

Java ReEntrantLock (Java代码实战-001)

∥☆過路亽.° 提交于 2021-02-16 23:22:57
Lock类也可以实现线程同步,而Lock获得锁需要执行lock方法,释放锁需要执行unLock方法 Lock类可以创建Condition对象,Condition对象用来使线程等待和唤醒线程,需要注意的是Condition对象的唤醒的是用同一个Condition执行await方法的线程,所以也就可以实现唤醒指定类的线程 Lock类分公平锁和不公平锁,公平锁是按照加锁顺序来的,非公平锁是不按顺序的,也就是说先执行lock方法的锁不一定先获得锁 Lock类有读锁和写锁,读读共享,写写互斥,读写互斥 import java.sql.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; /** * ReEntrantLockTest */ public class ReEntrantLockTest { private static final int THREAD_COUNT = 4 ; private

深入探讨Hotspot虚拟机在Java堆中对象创建、布局和访问的过程

≯℡__Kan透↙ 提交于 2021-02-16 16:23:40
在我们了解了JVM的运行时数据区划分后,我们需要进一步了解JVM内存中数据进一步的细节,例如对象是如何创建的,如何布局,及如何访问这些对象。接下来会从3个部分来探讨下Java堆中对象的创建及其访问过程。 对象的创建 检查 ,JVM收到 new 指令,首先去检查是否能在常量池中定位到一个 class 的符号引用,并检查这个引用代表的 class 是否被加载、解析和初始化过,如果没有则执行类加载过程。 分配内存 ,类加载通过后,JVM会为这个 class 分配内存。分配内存有两种方式,一种叫 指针碰撞 ,一种叫 空闲列表 指针碰撞 :假设heap是绝对连续规整的,空闲的内存和已使用的内存各在一边,中间放置一个指针作为分界点的指示器,分配内存时只需要把指针挪向空闲内存的那边即可。 空闲列表 :如果heap不是规整的,空闲内存和已使用的内存交错分布,JVM会维护一个列表,记录哪些内存时可用的,分配内存是从列表里找一块足够存放对象的内存分配给它。 选择哪种分配方式由JVM所采用的垃圾收集器是否带有压缩整理的功能决定,因此在使用 Serial 、 ParNew 等带有Compact过程的收集器时,系统采用的分配算法是指针碰撞,而使用 CMS 这种基于Mark-Sweep算法的收集器时,通常采用空闲列表。 在分配内存过程中可能由于并发引起线程不安全的问题,JVM有两种解决方案,一、采用CAS

synchronized 锁的升级

倾然丶 夕夏残阳落幕 提交于 2021-02-15 14:01:22
synchronized 的基本认识 在多线程并发编程中 synchronized 一直是元老级角色,很 多人都会称呼它为重量级锁。但是,随着 Java SE 1.6 对 synchronized 进行了各种优化之后,有些情况下它就并不 那么重,Java SE 1.6 中为了减少获得锁和释放锁带来的性 能消耗而引入的偏向锁和轻量级锁。 synchronized 有三种方式来加锁, 1. 修饰实例方法,作用于当前实例加锁,进入同步代码前 要获得当前实例的锁 2. 静态方法,作用于当前类对象加锁,进入同步代码前要 获得当前类对象的锁 3. 修饰代码块,指定加锁对象,对给定对象加锁,进入同 步代码库前要获得给定对象的锁。 // 修饰实例方法, 锁作用域是this public synchronized void SyncMethod1() { } // 修饰实例方法2,锁作用域是this.lock public void SyncMethod2() { synchronized ( this .lock) { } } // 修饰实例方法3, 锁作用域是this对象 public synchronized void SyncMethod3() { synchronized ( this ) { } } // 静态方法 锁作用域是整个class public static

RocketMQ中Broker的刷盘源码分析

与世无争的帅哥 提交于 2021-02-15 04:03:51
上一篇博客的最后简单提了下CommitLog的刷盘 【RocketMQ中Broker的消息存储源码分析】 (这篇博客和上一篇有很大的联系) Broker的CommitLog刷盘会启动一个线程,不停地将缓冲区的内容写入磁盘(CommitLog文件)中,主要分为异步刷盘和同步刷盘 异步刷盘又可以分为两种方式: ①缓存到mappedByteBuffer -> 写入磁盘(包括同步刷盘) ②缓存到writeBuffer -> 缓存到fileChannel -> 写入磁盘 (前面说过的开启内存字节缓冲区情况下) CommitLog的两种刷盘模式: 1 public enum FlushDiskType { 2 SYNC_FLUSH, 3 ASYNC_FLUSH 4 } 同步和异步,同步刷盘由GroupCommitService实现,异步刷盘由FlushRealTimeService实现,默认采用异步刷盘 在采用异步刷盘的模式下,若是开启内存字节缓冲区,那么会在FlushRealTimeService的基础上开启CommitRealTimeService 同步刷盘: 启动GroupCommitService线程: 1 public void run() { 2 CommitLog.log.info( this .getServiceName() + " service started" ); 3

2018"百度之星"程序设计大赛

淺唱寂寞╮ 提交于 2021-02-15 02:42:24
调查问卷 Accepts: 505 Submissions: 2436 Time Limit: 6500/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Problem Description 度度熊为了完成毕业论文,需要收集一些数据来支撑他的论据,于是设计了一份包含 m m 个问题的调查问卷,每个问题只有 'A' 和 'B' 两种选项。 将问卷散发出去之后,度度熊收到了 n n 份互不相同的问卷,在整理结果的时候,他发现可以只保留其中的一部分问题,使得这 n n 份问卷仍然是互不相同的。这里认为两张问卷是不同的,当且仅当存在至少一个被保留的问题在这两份问卷中的回答不同。 现在度度熊想知道,存在多少个问题集合,使得这 n n 份问卷在只保留这个集合的问题之后至少有 k k 对问卷是不同的。 Input 第一行包含一个整数 T T,表示有 T T 组测试数据。 接下来依次描述 T T 组测试数据。对于每组测试数据: 第一行包含三个整数 n n, m m 和 k k,含义同题目描述。 接下来 n n 行,每行包含一个长度为 m m 的只包含 'A' 和 'B' 的字符串,表示这份问卷对每个问题的回答。 保证 1 \leq T \leq 100 1 ≤ T ≤ 1 0 0, 1 \leq n \leq

浅谈Java队列Queue

别等时光非礼了梦想. 提交于 2021-02-12 02:48:41
队列Queue就是一个先进先出的数据结构,与List、Set同一级别,继承了Collection接口。 一、Queue的实现 1、阻塞队列(BlockingQueue) ① 插入:队列不满时可执行插入元素线程,直到队列满。 ② 移除:队列不为空都可移除,直到队列为空。 抛出异常:满的时候插入,空的时候取出都会抛异常。 返回特殊值:插入成功返回true 一直阻塞:满时put和空时take会阻塞线程,直到队列可用。 超时退出:满时会阻塞插入一段时间,如果超过一定时间,线程就会退出。 JDK7提供了7个阻塞队列: ① ArrayListBlockingQueue ArrayBlockingQueue是一个由数组支持的有界阻塞队列。在读写操作上都需要锁住整个容器,因此吞吐量与一般的实现是相似的,适合于实现“生产者消费者”模式。 ② LinkedBlockingQueue 一个由链表结构组成的双向阻塞队列。 基于链表的阻塞队列,内部维持这一关数据缓冲队列。当生产者往队列中放入一个数据时,队列会从生产者手中获取数据,并缓存在队列内部,而生产者立即返回;当队列缓冲区达到最大缓冲容量时,才会阻塞生产者队列,直到消费者从队列中消费掉一份数据,生成者线程才会被唤醒,反之对消费者的处理也基于同样的原理。 LinkedBlockingQueue 之所以能够高效的处理并发数据,还因为其

Cas no attributes come to client

限于喜欢 提交于 2021-02-10 09:35:31
问题 i am building SSO application with CAS. in spring client, no attributes came with CasAssertionAuthenticationToken . there are lots of samples on net, they seems to have no problem with this ( is something obvious missing?) for cas server, its all default configuration except i changed registered service default to make sure that is not the problem. this part look like this: <bean class="org.jasig.cas.services.RegexRegisteredService"> <property name="id" value="1"/> <property name="name" value