闭锁(Latch)实现 CountDownLatch 和 栅栏
2019-05-15 本文已影响3人
entro
闭锁(Latch)实现 CountDownLatch 和 栅栏 CyclicBarrier
闭锁 CountDownLatch 是一个主线程等待多个子线程。
栅栏 CyclicBarrier 是多个线程相互等待,只要一个没完成,所有线程都等待。
一、闭锁实现 CountDownLatch
CountDownLatch是一个同步工具类,是一种灵活的闭锁实现。位于concurrent包(jdk1.5引入)下。
常用的ConcurrentHashMap、BlockingQueue、CyclicBarrier(栅栏)也位于该包下。
CountDownLatch的主要作用 等待结束 同时开始
- 等待结束:使一个线程等待其他线程完成各自的工作后再执行,即并发场景中的
等待结束
(5种常见的并发场景)。 - 同时开始(实现最大的并行性):还有另外一种变形应用:把计数器初始值设为1,多个线程调用
await()
方法,可以实现并发场景中的同时开始
。
CountDownLatch的实现原理
CountDownLatch是一个灵活的闭锁实现,包含一个计数器,初始值是线程数量(需要等待的事件个数)在构造函数中设置。每个线程执行完后就减一。
await方法等待计数器到达0,表示所有需要等待的事件都已经完成,然后继续执行当前线程。
二、栅栏 CyclicBarrier
顾名思义:可循环(Cyclic)的屏障(Barrier)。让一组线程到达一个栅栏屏障都被阻塞,直到最后一个线程到达。
CyclicBarrier的构造方法CyclicBarrier(int parties)
的参数parties表示屏障拦截的线程数量。
线程调用await()
方法告诉CyclicBarrier我已到达屏障。然后阻塞当前线程。
CyclicBarrier还提供了另一个构造方法 CyclicBarrier(int parties, Runnable barrierAction)
。
用于在线程到达屏障时,优先执行barrierAction这个Runnable对象,用来处理稍微复杂的业务场景。
三、CountDownLatch和CyclicBarrier常见的几个面试题
- CountDownLatch的概念?
CountDownLatch内部使用几个计数器,初始大小为要等待线程的个数,每个线程执行完毕,计数器减一。最终计数器等于0时唤醒主线程。 - CountDownLatch和CyclicBarrier的区别?
CyclicBarrier是多个线程同时等待,一个没完,所有等待。 - CountDownLatch的主要方法及使用场景?
主要方法await()
和countDown()
,使用在等待开始和同时开始等场景下。