在[JUC] AQS独占模式详解中我们已经结合ReentrantLock
分析了AQS独占模式的实现,本文将结合CountDownLatch
分析共享模式的实现。
场景说明
如下图所示,有一个初始值为3的CountDownLatch
,线程t1和t2在时间线1调用await
等待latch
的值变为0,线程t3在时间线2调用countDown()
将latch
值减1,线程t4在时间线3调用countDown()
将latch
值减1,线程t5在时间线4调用countDown()
将latch
值减1,此时latch
值变为0,线程t1和t2在时间线4后同时获取到锁
CountDownLatch是如何使用AQS
首先我们看构造一个CountDownLatch
做了什么事情
CountDownLatch latch = new CountDownLatch(3);
CountDownLatch
构造方法实现如下
public CountDownLatch(int count) {
if (count < 0) throw new IllegalArgumentException("count < 0");
// 创建一个内部的Sync对象,并传入count
this.sync = new Sync(count);
}
private static final class Sync extends AbstractQueuedSynchronizer {
...
Sync(int count) {
// 将AQS的同步状态state设为count
setState(count);
}
...
}
可见CountDownLatch
的构造方法就是将传入的count
设置到AQS的同步状态state上去。