CountDownLatch
CountDownLatch是编程过程中保持线程同步的一种常用方式。英文直译过来就是计数门闩,看下下面的举例用法就一目了然了。

执行的打印结果为:

有个静态内部类继承了AQS,本质上是依赖AQS的共享模式实现的。

把AQS里的state值设为传入的值 2。

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


唤醒thread3,此时线程队列


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


执行的打印结果为:
thread1 do bussiness
thread2 do bussiness
thread3 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时,阻塞的线程将会被唤醒。
因为相信,所以看见.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2020-08-03 PostgreSQL 常用函数