Java并发编程之CountDownLatch概念

前言

CountDownLatch是一个同步的辅助类,它可以允许一个或多个线程等待,直到一组在其它线程中的操作执行完成。

一个CountDownLatch会通过一个给定的count数来被初始化。其中await()方法会一直阻塞,直到当前的count被减到0,而这个过程是通过调用countDown()方法来实现的。在await()方法不再阻塞以后,所有等待的线程都会被释放,并且任何await()的子调用都会立刻返回。

CountDownLatch是通过一个计数器来实现的,计数器的初始值为初始任务的数量。每当完成了一个任务后,计数器的值就会减1(CountDownLatch.countDown()方法)。当计数器值到达0时,它表示所有的已经完成了任务,然后在闭锁上等待CountDownLatch.await()方法的线程就可以恢复执行任务。

需要注意,CountDownLatch计数器必须大于等于0,只有等于0的时候,计数器就是0,调用await方法时不会阻塞当前线程

应用场景

启动框架,框架有所谓的主线程,框架肯定有很多初始化工作(连接数据库,读取配置文件等等),如果放在主线程里面去做,会影响框架启动的性能,我们把初始化工作放在初始化线程里面去工作.我希望主线程必须要等待初始化线程里面的所有初始化工作完成以后再去执行主线程的任务(相关代码),

实现最大的并行性:有时我们想同时启动多个线程,实现最大程度的并行性。例如,我们想测试一个单例类。如果我们创建一个初始计数为1的CountDownLatch,并让所有线程都在这个锁上等待,那么我们可以很轻松地完成测试。我们只需调用 一次countDown()方法就可以让所有的等待线程同时恢复执行。
开始执行前等待n个线程完成各自任务:例如应用程序启动类要确保在处理用户请求前,所有N个外部系统已经启动和运行了,例如处理excel中多个表单。

TW1 TW2主线程一直wait等待中, 当 Ta Tb Tc Td 四个子线程都完成工作调用 countDown()就是把初始化的CNT计数器减一,直到CNT计数器变为0的时候,TW1和TW2两个工作线程就开始唤醒了,就开始继续运行了.
Java并发编程之CountDownLatch概念

特别注意

1.countDown计数器和线程数并不是一对一关系,而是计数器是可以远远大于初始化线程数的. 一个线程完全可以调用多次countDown()方法对CNT计数器减一操作

2.工作线程(初始化线程)当扣减完CNT计数器之后完全可以继续运行,并不是初始化线程做完CNT计数器归零之后就一定要关闭退出等等
3. await()可以是多个线程等待

API

await() 能够阻塞线程 直到调用N次countDown() 方法等待countDownLatch计数器为0的时候才唤醒线程

countDown() 可以在多个线程中调用 计算调用次数是所有线程调用次数的总和

getCount() 获取当前的countDownLatch计数器.

演示代码

https://blog.csdn.net/qq_41489540/article/details/109166921