执行的打印结果为:
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时,阻塞的线程将会被唤醒。
因为相信,所以看见.