目录
简介
countdownLatch,允许一个或多个线程等待,直到其他线程完结.
一种闭锁(Latch)实现.闭锁状态包括一个计数器,该计数器被初始化为1个整数,表示要等待的事件数量.
可以延迟线程的进度直到线程到达某个终点状态。通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都将通过,但是一旦大门打开,所有线程都通过了,那么这个闭锁的状态就失效了,门的状态也就不能变了,只能是打开状态。也就是说闭锁的状态是一次性的,它确保在闭锁打开之前所有特定的活动都需要在闭锁打开之后才能完成。
应用场景
CountDownLatch是一个通用的同步工具,它能用于许多用途。一个使用’1’计数值初始化的CountDownLatch服务作为一个简单的开关门:所有执行await的线程等待在门口,直到某个执行countDown方法的线程将门打开。一个使用‘N(count)’初始化的CountDownLatch能被用于使一个线程等待,直到N个线程完成某些动作,或者某些动作已经完成N次
- 确保某个计算在所有资源加载完毕后菜继续执行.
- 确保服务在其所有依赖的其他服务都已经启动后启动.
- 等待某个操作的所有参与者都就绪在继续执行.
方法
countDown()
方法对计数器做减法.await()
方法等待计数器达到0,所有await的线程都会阻塞直到计数器为0或者中断或者超时.
直到count到达0,一个线程调用countDown()方法之前的动作 happen-before 从另一个线程相应的await()方法返回之后的动作。
源码浅析
1 | private static final class Sync extends AbstractQueuedSynchronizer { |
countdownLatch主要就是通过AQS的state实现同步控制.CountDownLatch使用的是共享锁模式(AQS还有排他锁).