CountDownLatch 是使用 AQS 现的,实际上是把计数器的值赋给了 AQS 的状态变量 state ,也就是这里使用 AQS 状态值来表示计数器值。
await方法
awai内部是调用acquireSharedInterruptibly方法:
当线程调 CountDownLatch 对象的 await 方法后 当前线程会被 直到下面的
情况之一发生才会返回 当所有线程都调用了 CountDownLatch 对象的 countDown 方法后,也就是计数器 值为0时;其他线程调用了当前线程的 interrupt ()方法中断了当前线程当前线程就会抛出 InterruptedException 异常 然后返回。
public final void acquireSharedInterruptibly(int arg)
throws InterruptedException {
if (Thread.interrupted())
throw new InterruptedException();
//当state计数值不为0时,阻塞主线程
if (tryAcquireShared(arg) < 0)
doAcquireSharedInterruptibly(arg);
}
//判断state计数值,为0时返回1,否则返回-1
protected int tryAcquireShared(int acquires) {
return (getState() == 0) ? 1 : -1;
}
countDown ()方法
线程调用该方法后 ,计数器的值递,递减后如果计数器值为0 则唤醒所有因调用await 法而被阻塞的主线程,否则什么都不做
public final boolean releaseShared(int arg) {
if (tryReleaseShared(arg)) {
//计数器返回true,释放锁,唤醒await的线程
doReleaseShared();
return true;
}
return false;
}
//计数器值减,当计数器值为0是返回true
protected boolean tryReleaseShared(int releases) {
// Decrement count; signal when transition to zero
for (;;) {
int c = getState();
if (c == 0)
return false;
int nextc = c - 1;
if (compareAndSetState(c, nextc))
return nextc == 0;
}
}