CountDownLatch
CountDownLatch使用场景
考虑一个场景:一个主线程要等待10个 Worker 线程工作完毕才退出,就能使用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个线程被唤醒。
本文暂时没有评论,来添加一个吧(●'◡'●)