Java AbstractQueuedSynchronizer的AcquiredQueued方法将在何时输入它';最后是街区吗?
当我阅读Jdk1.8的AbstractQueuedSynchronizer的源代码时,我很长时间都在想AbstractQueuedSynchronizer的AcquiredQueued方法。在这种情况下,调用将进入'finally'块,cancelAcquire方法?跳出循环必须是'return'逻辑,其中“failed”设置为false。我猜Java AbstractQueuedSynchronizer的AcquiredQueued方法将在何时输入它';最后是街区吗?,java,concurrency,java.util.concurrent,Java,Concurrency,Java.util.concurrent,当我阅读Jdk1.8的AbstractQueuedSynchronizer的源代码时,我很长时间都在想AbstractQueuedSynchronizer的AcquiredQueued方法。在这种情况下,调用将进入'finally'块,cancelAcquire方法?跳出循环必须是'return'逻辑,其中“failed”设置为false。我猜cancelAcquire()将在tryAcquire(arg)抛出一个IllegalMonitorStateException后遇到。如果当前线程为锁而
cancelAcquire()
将在tryAcquire(arg)
抛出一个IllegalMonitorStateException
后遇到。如果当前线程为锁而竞争被中断,则If条件将保持为true:
if(应在失败后停止采集(p,节点)&&Park和CheckInterrupt())
中断=真
然后将执行finally块中的代码
否则,它将始终被阻止,直到调用LockSupport.unpark方法。当您重写
tryAcquire()
时,可能会引发错误或异常。
acquiredqueued()
标记为final
。
示例类
ReentrantLock.FairSync
关于tryAcquire()
抛出一个错误
我认为您不太确定try finally
块的作用。这意味着finally
中的此代码块将始终执行,无论它如何退出try
块,即使它是通过return
语句或未捕获异常执行的。调用cancelAcquire()
的唯一时间是try
块未到达failed=false时由于if
语句,代码>行。@jai看来for
循环退出的唯一方法是在return中断时返回代码>已<代码>失败=错误代码>在其前面设置。还是我错过了可能发生的运行时异常?@ScaryWombat既然你提到了这一点,看起来唯一可能发生这种情况的方法是在其中一个方法中出现运行时异常
。就像在LockSupport#pack进行阻塞时阻塞线程被中断,并抛出一个InterruptedException一样?InterruptedException
是一个选中的异常
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);
}
}