我正在研究AbstractQueuedSynchronizer类的源代码,当我阅读acquireQueued方法的代码时:
final boolean acquireQueued(final Node node, int arg) {
boolean failed = true;
try {
boolean interrupted = false;
for (;;) {
final Node p = node.predecessor();
if (p == head && tryAcquire(arg)) {
setHead(node);
p.next = null; // help GC
failed = false;
return interrupted;
}
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
interrupted = true;
}
} finally {
if (failed)
cancelAcquire(node);
}
}语句final Node p = node.predecessor();表示获取当前节点的上一个节点p。下一个if语句尝试比较p节点和head节点。
我的疑问是如何更改head节点以便代码可以进入if语句,以及更改发生在哪个代码块中
似乎在shouldParkAfterFailedAcquire/parkAndCheckInterrupt/release/unparkSuccessor方法中找不到代码块
发布于 2019-11-21 11:03:21
setHead(node); if语句并不一定意味着头已经改变。如果该节点的前一个节点被取消,则该节点可以充当头节点的后节点。请参见shouldParkAfterFailedAcquire method中的详细信息
https://stackoverflow.com/questions/55721000
复制相似问题