整体概况
CountDownLatch的代码很简洁,主要方法就两个,一个是阻塞方法await,一个是解锁方法countDown,这两个方法都是利用内部的同步器对状态变量的控制来实现的,整体源码结构如下图所示。

初始化
CountDownLatch的构造方法就是给状态变量初始化,状态变量的值代表资源的个数。如下图所示

await方法
CountDownLatch的await方法是通过AQS的acquireSharedInterruptibly方法实现的,acquireSharedInterruptibly方法内部通过调用tryAcquireShared方法来判断是否获取锁成功,而tryAcquireShared方法是抽象的,需要子类重写,CountDownLatch里面的Sync正是通过重写通过判断状态变量是否为0来判断是否获取锁成功。如下图所示。


countDown方法
countDown借助AQS的releaseShared方法来释放资源,而AQS的releaseShared方法会调用子类的tryReleaseShared方法。Sync的tryReleaseShared方法很简单,就是利用CAS将状态变量的值加1,并且把这个操作放在死循环里面,确保状态变量的值成功加1。如下图所示。



网友评论