凡事都在事上磨,这样才能精进,成长进步提高! ------ 博客园首页

CountDownLatch

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

posted @   追风fc  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2020-08-03 PostgreSQL 常用函数
点击右上角即可分享
微信分享提示