CountDownLatch

发布时间 2023-08-03 10:19:08作者: 追风fc
CountDownLatch是编程过程中保持线程同步的一种常用方式。英文直译过来就是计数门闩,看下下面的举例用法就一目了然了。

执行的打印结果为:
thread1 do bussiness
thread2 do bussiness
thread3 do bussiness
线程3要等线程1和2释放锁才能执行。
 
 
下面来看源码是如何实现的。
先看下CountDownLatch类的属性

有个静态内部类继承了AQS,本质上是依赖AQS的共享模式实现的。
 
类里的内容很清爽,我们只要看三块内容就可以了。构造方法;await()方法;countdown()方法。
我们从举例的代码一步步分析。
1.构造方法

把AQS里的state值设为传入的值 2。
 
2.thread3.await()
按上面举例的场景,首先会执行到thread3的await()方法
首先判断state不为0,则执行下面核心代码

thread3进入线程队列,并阻塞。此时的线程队列如下


3. 下一步thread1会执行到countDown();
将state减1,为1;其他无事发生。
 
4.下一步thread2执行到countDown();
state为0;执行下面核心代码

唤醒thread3,此时线程队列


5.继续从thread3阻塞位置往下执行

改变线程队列后,跳出循环,之后继续执行业务。此时的线程队列为


 

总结:

CountDownLatch利用AQS的共享模式实现了倒计数门闩功能。

初始化N个门闩,线程在调用await方法时,如果门闩数大于0,则线程被阻塞。

每个线程调用countDown方法会将门闩数减一,当门闩数减为0时,阻塞的线程将会被唤醒。