概念
CountDownLatch是在jdk1.5的时候引入的,位于java.util.concurrent并发包中,CountDownLatch叫做闭锁
.
CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其它线程执行完后再执行
.
工作原理
CountDownLatch是通过一个计数器
来实现的,计数器的初始化值为线程的数量
.每当一个线程完成了自己的任务后,计数器的值相应的减1.当计数器的值减到0时,表示所有的线程都已完成任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务.
常用方法
public CountDownLatch(int count)
CountDownLatch接收一个int型的参数,表示要等待的工作线程的个数public void await()
使当前线程进入同步队列等待,直到计数器的值减到0或者当前线程被中断,当前线程就会被唤醒.public boolean await(long timeout,TimeUnit unit)
带超时时间的await()public void CountDown()
使计数器的值减1,如果减到了0,则会唤醒所有等待在这个CountDownLatch上的线程.public long getCount()
获取CountDownLatch的数值,也就是计数器的值
使用场景
- 实现最大的并行性:
有时我们想同时启动多个线程,实现最大程度的并行性.如果我们创建一个初始计数器为1的CountDownLatch,多个线程在开始执行任务前首先CountDownLatch.await()在这个锁上等待,只需要主线程调用一次CountDown()方法就可以让其它所有等待的线程同时恢复执行.类似于赛跑,将多个线程放到起点,等待发令枪响,然后同时开跑. - 开始执行前等待N个线程完成各自的任务后,进行汇总合并:
例如,我们需要使用多线程统计完所有的数据之后,做一个汇总,就可以使用CountDownLatch
缺点
CountDownLatch是一次性的,计数器的值只能在构造方法中初始化一次,之后不能再次对其设置值,当CountDownLatch使用完毕后,它不能再次被使用.