一旦ThreadA被唤醒,代码又会继续回到doAcquireSharedInterruptibly中来执行。如果当前state满足=0的条件,则会执行setHeadAndPropagate方法
private void doAcquireSharedInterruptibly(int arg) throws InterruptedException {
final Node node = addWaiter(Node.SHARED);
boolean failed = true;
try {
for (;;) {//被唤醒的线程进入下一 次循环继续判断
final Node p = node.predecessor();
if (p == head) {
int r =
tryAcquireShared(arg);
if (r >= 0) {
setHeadAndPropagate(node, r);
p.next = null; // 把当前节点移除aqs队列
failed = false;
return;
}
}
if (shouldParkAfterFailedAcquire(p, node) && parkAndCheckInterrupt())
throw new InterruptedException();
}
} finally {
if (failed)
cancelAcquire(node);
}
}