CountDownLatch:实现 一个或多个线程 等待 其他一组线程的操作执行完成。
1、内部类:Sync extends AbstractQueuedSynchronizer ,
继承了AQS,并实现了tryAcquireShared,tryReleaseShared方法,同时拥有构造方法:
Sync(int count) {
setState(count);
}
2、属性:
private final Sync sync;
CountDownLatch构造函数,会设置该属性
3、方法:
1)public CountDownLatch(int count){
if (count < 0) throw new IllegalArgumentException("count < 0");
this.sync = new Sync(count);
}
构造函数
2)public void await()
阻塞当前线程,等待 一组线程执行完成(其实就是等待count=0),当count = 0时,才能唤醒该线程,唤醒操作在countDown方法逻辑里。
3)public boolean await(long timeout, TimeUnit unit)
同await方法,只是增加了超时时间
4)public void countDown()
执行count-1,当count减到0的时候,就会循环唤醒其他阻塞等待的线程。
5)public long getCount()
获取count值,
4、实现原理:
使用了AbstractQueuedSynchronizer类来实现线程锁的操作。实现步骤:
1)构造函数初始化Sync,并将state设置为该数量。
2)当调用await时,新建share节点,入队列,并阻塞当前线程,直到被其他线程唤醒。
3)当调用countDown时,如果state被减为0了,则统一去唤醒还在排队等待唤醒的线程(即调过await方法的线程)