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);
}
}
当我读到Jdk1.8的AbstractQueuedSynchronizer的源代码时,我想到了AbstractQueuedSynchronizer的acquireQueued方法很长一段时间。在这种情况下,调用将最终进入'阻止和cancelAcquire方法?跳出循环必须是' return'逻辑,其中'失败'被设置为假。
答案 0 :(得分:0)
我想cancelAcquire()
会在tryAcquire(arg)
投掷IllegalMonitorStateException
之后再见面。
答案 1 :(得分:0)
如果当前争夺线程的线程被中断,则if条件将成立:
如果(shouldParkAfterFailedAcquire(p,node)&& parkAndCheckInterrupt()) 中断=真;
然后将执行finally块中的代码。
否则,它将一直被阻止,直到调用LockSupport.unpark方法为止。
答案 2 :(得分:0)
当您覆盖 tryAcquire()
时,可能会抛出错误或异常。
acquireQueued()
用 final
标记。
示例类 ReentrantLock.FairSync
关于 tryAcquire()
抛出一个 Error