方法何时获取AbstractQueuedSynchronizer入口的值,它最终会阻塞?

时间:2018-06-07 02:20:18

标签: java concurrency java.util.concurrent

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'逻辑,其中'失败'被设置为假。

3 个答案:

答案 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