Java AbstractQueuedSynchronizer的AcquiredQueued方法将在何时输入它';最后是街区吗?

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后遇到。如果当前线程为锁而

当我阅读Jdk1.8的AbstractQueuedSynchronizer的源代码时,我很长时间都在想AbstractQueuedSynchronizer的AcquiredQueued方法。在这种情况下,调用将进入'finally'块,cancelAcquire方法?跳出循环必须是'return'逻辑,其中“failed”设置为false。

我猜
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);
    }
}