专业的JAVA编程教程与资源

网站首页 > java教程 正文

跟着大神学Java并发原理JDK源码剖析之同步工具类CountDownLatch

temp10 2025-02-18 13:27:20 java教程 11 ℃ 0 评论

CountDownLatch

CountDownLatch使用场景

考虑一个场景:一个主线程要等待10个 Worker 线程工作完毕才退出,就能使用CountDownLatch来实现。

跟着大神学Java并发原理JDK源码剖析之同步工具类CountDownLatch

图4-3所示为CountDownLatch相关类的继承层次,CountDownLatch原理和Semaphore原理类似,同样是基于AQS,不过没有公平和非公平之分。

await()实现分析

如下所示,await()调用的是 AQS 的模板方法,这个方法在前面已经介绍过。CountDownLatch.Sync重新实现了tryAccuqireShared方法。

从tryAcquireShared(..)方法的实现来看,只要state!=0,调用await()方法的线程便会被放入AQS的阻塞队列,进入阻塞状态。

countDown()实现分析

countDown()调用的 AQS 的模板方法 releaseShared(),里面的 tryReleaseShared(..)被CountDownLatch.Sync重新实现。从上面的代码可以看出,只有state=0,tryReleaseShared(..)才会返回true,然后执行doReleaseShared(..),一次性唤醒队列中所有阻塞的线程。

最后做一下小结:因为是基于 AQS 阻塞队列来实现的,所以可以让多个线程都阻塞在state=0条件上,通过countDown()一直累减state,减到0后一次性唤醒所有线程。如图4-4所示,假设初始总数为M,N个线程await(),M个线程countDown(),减到0之后,N个线程被唤醒。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表