11、常用的并发工具类有哪些?
1、CountDownLatch 2、CyclicBarrier 3、Semaphore 4、Exchanger
12、CyclicBarrier 和 CountDownLatch 的区别?
1、CountDownLatch 简单的说就是一个线程等待,直到他所等待的其他线程都执 行完成并且调用 countDown()方法发出通知后,当前线程才可以继续执行。
2、cyclicBarrier 是所有线程都进行等待,直到所有线程都准备好进入 await()方 法之后,所有线程同时开始执行!
3、CountDownLatch 的计数器只能使用一次。而 CyclicBarrier 的计数器可以使 用 reset() 方法重置。所以 CyclicBarrier 能处理更为复杂的业务场景,比如如果 计算发生错误,可以重置计数器,并让线程们重新执行一次。
4、CyclicBarrier 还提供其他有用的方法,比如 getNumberWaiting 方法可以获 得 CyclicBarrier 阻塞的线程数量。isBroken 方法用来知道阻塞的线程是否被中断。 如果被中断返回 true,否则返回 false。
13、synchronized 的作用?
在 Java 中,synchronized 关键字是用来控制线程同步的,就是在多线程的环境 下,控制 synchronized 代码段不被多个线程同时执行。 synchronized 既可以加在一段代码上,也可以加在方法上。
14、volatile 关键字的作用
对于可见性,Java 提供了 volatile 关键字来保证可见性。 当一个共享变量被 volatile 修饰时,它会保证修改的值会立即被更新到主存,当 有其他线程需要读取时,它会去内存中读取新值。 从实践角度而言,volatile 的一个重要作用就是和 CAS 结合,保证了原子性,详 细的可以参见 java.util.concurrent.atomic 包下的类,比如 AtomicInteger。
15、什么是 CAS
CAS 是 compare and swap 的缩写,即我们所说的比较交换。 cas 是一种基于锁的操作,而且是乐观锁。在 java 中锁分为乐观锁和悲观锁。悲 观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资源,比如通 过给记录加 version 来获取数据,性能较悲观锁有很大的提高。 CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如 果内存地址里面的值和 A 的值是一样的,那么就将内存里面的值更新成 B。CAS 是通过无限循环来获取数据的,若果在第一轮循环中,a 线程获取地址里面的值被 b 线程修改了,那么 a 线程需要自旋,到下次循环才有可能机会执行。 java.util.concurrent.atomic 包下的类大多是使用 CAS 操作来实现的 ( AtomicInteger,AtomicBoolean,AtomicLong)。