执行的打印结果为:

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时,阻塞的线程将会被唤醒。

因为相信,所以看见.