CountDownLatch countDownLatch=new CountDownLatch(20);
Sync(int count) {
setState(count); // 首先创建时的 计数 就是等待多少个线程通过 countDown后 await的线程被
// 唤醒 所以 这个state = 创建时的个数 那么 每次relase 一次就减去1
}
countDownLatch.await(); 方法
public final void acquireSharedInterruptibly(int arg)
throws InterruptedException {
//因为允许中断 所以 检测
if (Thread.interrupted())
throw new InterruptedException();
// 判断是否=0 不等于 0 那么就返回-1 可以获取 锁
// 所以 这个东西默认只能使用一次的。new 一次用一次
if (tryAcquireShared(arg) < 0)
//这个方法就是 普通的 aqs 里面的方法 首先把自己 加入clh队列
// 然后把自己 park() 处于watting状态 等待 后续countDown 把自己唤醒 比较简单
doAcquireSharedInterruptibly(arg);
}
countDownLatch.countDown(); 方法
public final boolean releaseShared(int arg) {
// 将state 的值 cas -1
if (tryReleaseShared(arg)) {
//这个方法 我在 读写锁中 有比较详情的注释
// 因为 countDOwnLatch 使用的是 共享方式
// await 可以有很多个线程 所以 使用 风暴的方式 唤醒后续的 线程
// 就是 被唤醒的线程 继续唤醒后续 Node
doReleaseShared();
return true;
}
return false;
}