目录
1. CountDownLatch
概述
CountDownLatch
来自于jdk 1.5
的JUC
包,是一种同步工具,常被称为闭锁,也叫做倒计数器- 这类似于在开始某个行为之前的准备操作。比如有一个任务
A
,它要等待其他4
个任务执行完毕之后才能执行,此时就可以利用CountDownLatch
来实现这种功能了。或者说CountDownLatch
是一个同步辅助类,允许一个或多个线程等待其他线程完成操作 - 它的实现是基于
AQS
框架的
CountDownLatch
源码阅读可需参考 AQS
框架的详解:https://blog.csdn.net/weixin_38192427/article/details/117028828
2. CountDownLatch
源码
2.1. CountDownLatch
类图
CountDownLatch
内部使用了AQS
框架来实现它的功能的
2.2. CountDownLatch
源码概览
public class CountDownLatch {
// 静态内部类 Sync 继承了 AQS
private static final class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = 4982264981922014374L;
Sync(int count) {
setState(count);
}
// 获取计数器值,实际上就是获取 state值
int getCount() {
return getState();
}
// 重写了父类 AQS 的方法,尝试共享式获取锁
protected int tryAcquireShared(int acquires) {
// 返回 1 代表获取成功,返回 -1 代表获取失败
return (getState() == 0) ? 1 : -1;
}
// 重写了父类 AQS 的方法,尝试共享式释放锁
protected boolean tryReleaseShared(int releases) {
for (;;) {
int c = getState();
if (c == 0)
return false;
int nextc = c-1;
if (compareAndSetState(c, nextc))
return nextc == 0;
}
}
}
private final Sync sync;
public CountDownLatch(int count) {
if (count < 0<