JDK的CountDownLatch的设计思路
和锁类似,Java实现CountDownLatch的时候也利用了一个叫做AQS的东西,源码参照java.util.concurrent.locks.AbstractQueuedSynchronizer。
这个类的其中一个思想核心是内部的一个state状态变量,这个状态会告诉你当前的锁是否可用,当前的latch是否倒计时结束等等。
核心接口连个方法,一个是countDown,另一个是await,countDown是改变状态的,await可以类比对锁的等待。
先看countDown
这里使用自旋的方式,原子性改变状态,如果改变成功就返回true。注意这个latch是不可重复使用的,所以如果状态是0的话就无法再使用了。而doReleaseShared是为了唤醒所有await该latch的线程,具体的说明可以参照https://blog.youkuaiyun.com/xxcupid/article/details/51909921。
Redisson版本的CountDownLatch设计思路
和Redisson实现分布式锁类似,需要利用到Redis的订阅/发布来实现通知的操作,来唤醒所有await当前latch的所有线程。
这里有一个叫做ReclosableLatch的类继承了AQS,