并发编程面试题之常用并发工具类
并发编程面试文章地址链接
常用的并发工具包有哪些
-
CountDownLatch CyclicBarrier Semaphore Exchanger
CountDownLatch 与 CyclicBarrier
CountDownLatch 不能重复使用, CyclicBarrier 可以重复使用 j.u.c 中的 CountDownLatch 可以看做是一个计数器, 这个计数器的操作是原子操作, 并且在同一时间只有一个线程去操作这个计数器, 在创建 CountDownLatch 的时候可以设置一个初始值, 任何线程调用这个对象上的 await() 方法都会阻塞, 直到这个计数器的计数值为 0; 所以在计数器为 0 之前, await() 方法会一直被阻塞, 然后会释放所有等待的线程, await 的后续调用都会立即返回, 这种情况只会出现一次, 所以 CountDownLatch 是不能重复使用的; CountDownLatch 的应用场景: 有一个任务想要往下执行, 但是必须等待其他的任务执行完毕后才可以继续往下执行的情况 CyclicBarrier 是一个同步的辅助类, 允许一组线程相互等待, 直到到达了某个 common barrier point, 在一组固定大小的线程的程序中, 这些线程需要一直相互等待, 这个时候就可以使用 CyclicBarrier, 因为 barrier 在释放等待的线程后可以重复使用
Semaphore 的作用
Semaphore 是一个信号量, 它的作用是限制某个代码块的并发数, 在创建 Semaphore 的时候可以阈值 n 代表某段代码最多 n 个线程可以访问, 如果超出了指定的阈值会被阻塞, 直到某个线程执行完毕这段代码, 下一个线程再进入, 如果创建 Semaphore 时候传入阈值是 1, 那么就类似 synchronized
Semaphore 与 ReentrantLock
Semaphore 基本上能完成 ReentrantLock 所有的工作, 其方法的功能与 ReentrantLock 类似, 通过 acquire() 和 release() 方法获取和释放临界区的资源 Semaphore#acquire() 默认是可响应中断锁, 类似 ReentrantLock#lockInterruptibly(), 在临界区中的资源可以被 Thread#interrupt() 释放 Semaphore 与 ReentrantLock 都是要手动的释放锁, 因此都是在 finally 代码块中完成
上一篇:
Java基础知识总结(2021版)
下一篇:
面试总结-java工程师面试大纲