主要作用为:列如提高性能操作线程池时,主线程需要等待所有线程操作完毕后,对返回值进行处理,可用发令枪闭锁实现
先贴源码(以下简称CDL)
CDL构造函数内部维护一个大于0的int变量,
调用countDown方法int变量减一操作,
调用await方法阻塞线程,当int变量被减为0时,阻塞线程放开,
传参timeout表示多少秒内计数器不管多少单位时间内不管int变量是否为0,都将放开该线程
注:因为内部sync继承了AQS,AQS内部CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中,所以在并发时,内部int变量通过CAS保证原子性。
demo代码:
CountDownLatch countDownLatch = new CountDownLatch(20);
Thread thread = new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() +"--"+ i);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
countDownLatch.countDown();
}
}
});
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+ "---" + i);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
countDownLatch.countDown();
}
}
});
thread.start();
thread2.start();
countDownLatch.await();
System.out.println("finish");
控制台打印:
线程每次CountDown,主线程await阻塞,当state为0时,放开主线程,执行sout操作
**Tips:**countDown操作需要放在finally块中,如果线程报错,依旧会countDown防止出现死锁