在[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上去。

本文通过分析CountDownLatch的实现原理,详细介绍了其如何利用AQS的共享模式进行线程间的同步操作。通过具体场景说明,展示了CountDownLatch在多线程环境下如何控制线程的等待与唤醒机制。
530





