简介
CountDownLatch是一种同步器,功能就让你一个或者多个线程等待其他线程完成任务后才开始执行,使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。
成员变量Sync分析
CountDownLatch 中只有Sync一个成员变量,Sync是一个实现了AQS队列的内部类,AQS的介绍可以在以前的文章中找到
- Sync提供带有int型构造函数指定线程的个数
- tryAcquireShared方法用于判断state是否已经 为0如果为0则阻塞线程可以启动
- tryReleaseShared当每一个启动的了的是线程效用countDown会调用该方法将state -1
private static final class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = 4982264981922014374L;
Sync(int count) {
setState(count);
}
int getCount() {
return getState();
}
protected int tryAcquireShared(int acquires) {
return (getState() == 0) ? 1 : -1;
}
protected boolean tryReleaseShared(int releases) {
// Decrement count; signal when transition to zero
for (;;) {
int c = getState();
if (c == 0)
return false;
int nextc = c-1;
if (compareAndSetState(c, nextc))
return nextc == 0;
}
}
}
CountDownLatch的方法
- CountDownLatch构造方法中count值必须大于0,并构造Sync
- countDown 方法将state进行-1操作
- await当state不为0将线程阻塞
用法
CountDownLatch latch = new CountDownLatch(2);
Thread t1 = new Thread(()->{
System.out.println("t1 start");
latch.countDown();
});
Thread t2 = new Thread(()->{
System.out.println("t2 start");
latch.countDown();
});
t1.start();
t2.start();
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t1,t2 完成,主线程开始");
输出
t1 start
t2 start
t1,t2 完成,主线程开始