[Java-juc] 并发工具类
2026年3月31日大约 2 分钟
[Java-juc] 并发工具类
CountDownLatch 了解吗?
CountDownLatch 是JUC中的同步工具类,用于让 count 个线程 等待其他线程完成操作后再继续执行。
- CountDownLatch 是一次性的,计数器的值只能在构造方法中初始化一次,当CountDownLatch使用完毕后,则无法再次使用。
CyclicBarrier 了解吗?
CyclicBarrier 是 可重复使用的屏障,用于让多个线程互相等待,直到所有线程都达到屏障后同时执行。
- 使用时,需要初始化
CyclicBarrier对象,并传入需要等待的线程数量。
线程需要调用await()方法来表示已到达屏障,并阻塞。当所有线程都到达屏障时,所有线程再继续执行。
CyclicBarrier 和 CountDownLatch 有什么区别?
CyclicBarrier 是让所有线程互相等待,全部到达后再执行;CountDownLatch 是让主线程等待其他线程执行完毕后再执行。
- 可重用性:CyclicBarrier 可以重复使用;CountDownLatch 不可重复使用。
- 是否可回调:CyclicBarrier 可以在所有线程到达屏障时执行指定的 Runnable 任务;CountDownLatch 没有这个功能。
Semaphore 了解吗?
Semaphore 信号量,用于控制同时访问某个资源的线程数量。
Exchanger 了解吗?
Exchanger 交换器,用于两个线程之间交换数据。
重点- 能说一下 ConcurrentHashMap 的实现吗?ConcurrentHashMap实现原理
ConcurrentHash 是HashMap 的线程安全版本。
- 在JDK7,采用的的是分段锁,Map会被分为若干段,可以在段上加锁,从而实现并发。
- 在JDK8,采用的是桶级别的锁,配合CAS和synchronized实现并发。
ConcurrentHashMap 怎么保证可见性?
ConcurrentHashMap 的 Node 节点中,value 和 next 都是 volatile 的,保证了其可见性。
为什么 ConcurrentHashMap 比 Hashtable 效率高?
- HashTable 是对整个 Map 加锁,导致在任何时候都只有一个线程可以访问。
- ConcurrentHashMap 采用 CAS和synchronized 实现,只在必要时加锁,允许多个线程同时访问,提高了效率。
能说一下 CopyOnWriteArrayList 的实现原理吗?
CopyOnWriteArrayList 适用于读多写少的场景,
写操作时,会创建一个新数组,修改完成后替换原数组;而读操作则是无锁的。
- 内部使用
volatile变量修饰数组array,保证读操作时的可见性。 - 写操作时,使用
ReentrantLock保证写操作时的线程安全。
能说一下 BlockingQueue 吗?
BlockingQueue 是JUC包下的线程安全队列,支持阻塞式的“生产者-消费者”模型。
- 当队列容器已满时,生产者线程会被阻塞;当队列为空时,消费者线程会被阻塞。
- 常见实现类有:ArrayBlockingQueue、PriorityBlockingQueue等。
阻塞队列是如何实现的?
阻塞队列使用 ReentrantLock 和 Condition 确保并发安全。