AQS内部类Node的Node.PROPAGATE状态仅在共享模式下使用,但当node.waitStatus为0时,它会导致相同的行为。后继节点是否会循环不止一次,那么除了区分这两种模式之外,他还有更多的实际用途吗?
private void doReleaseShared() {
for (;;) {
Node h = head;
if (h != null && h != tail) {
int ws = h.waitStatus;
if (ws == Node.SIGNAL) {
if (!h.compareAndSetWaitStatus(Node.SIGNAL, 0))
continue; // loop to recheck cases
unparkSuccessor(h);
}
else if (ws == 0 &&
!h.compareAndSetWaitStatus(0, Node.PROPAGATE))
continue; // loop on failed CAS
}
if (h == head) // loop if head changed
break;
}
}我的问题是在这里生成的。
发布于 2019-01-06 23:30:58
只能为头节点设置waitStatus值Node.PROPAGATE。仅指示头节点后继节点将传播未驻留的后继节点行为。因为当当前节点成功获取共享锁时,后续节点可能成功获取共享锁。
https://stackoverflow.com/questions/53882320
复制相似问题