写在前面
_作者Doug Lea_如此描述这个类:A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.
分析自JDK 1.8.0_171
这是一个多线程协调的辅助类。源码中给出的示例代码:
1 | class Driver { // ... |
通过示例对CountDownLatch的使用场景应该有个清晰的认识。即当有需要线程等待,直到在其他线程的一系列操作完成之后,再接着往下执行。
Sync变量
Sync类是CountDownLatch的一个内部类,继承自 AbstractQueuedSynchronizer
,也就是常说的AQS。内部类重写了AQS的 tryAcquireShared
和 tryReleaseShared
两个方法。此外Sync的构造函数带一个int参数,在构造函数内调用了AQS的 setState
方法,这个方法是对AQS的内部一个int volatile变量赋值。
1 | private static final class Sync extends AbstractQueuedSynchronizer { |
在上边的示例中,我们用到了 CountDownLatch
的 await
方法和 countDown
方法,CountDownLatch的功能也就是通过这两个方法实现。这两个方法其实也就是调用sync。
CountDownLatch.await
功能:当前线程等待,直到state等于0,或该线程interrupt。
该方法就是调用 sync.acquireSharedInterruptibly(1)
。
1 | public final void acquireSharedInterruptibly(int arg) |
总结:CountDownLatch.await就是调用LockSupport.park阻塞当前线程,并用一链表表示所有阻塞的线程,方便唤醒时一一唤醒。
CountDownLatch.countDown
功能:令state减1,但state为0时,唤醒所有等待线程。
该方法是调用 sync.releaseShared(1)
。
1 | public final boolean releaseShared(int arg) { |
CountDownLatch源码分析的整个流程就是这样。CountDownLatch的功能是基于AQS展开,在后续的JUC的分析文章中还可以看到AQS的身影。谢谢。