Когда метод acquQueued из записи AbstractQueuedSynchronizer будет окончательно заблокирован? - PullRequest
0 голосов
/ 07 июня 2018
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);
    }
}

Когда я читаю исходный код AbstractQueuedSynchronizer из Jdk1.8, я долго думаю о методе acquQueued в AbstractQueuedSynchronizer. При каком условии, вызов будет вводить блок 'finally' и метод cancelAcquire?Прыжок из цикла должен быть логикой возврата, в которой для «неудачи» было установлено значение «ложь».

Ответы [ 2 ]

0 голосов
/ 23 августа 2019

Если текущий поток, участвующий в гонке за блокировку, прерван, то условие if будет выполняться:

if (shouldParkAfterFailedAcquire (p, node) && parkAndCheckInterrupt ()) interrupted = true;

тогда будет выполнен код в блоке finally.

В противном случае он всегда будет блокирован до вызова метода LockSupport.unpark.

0 голосов
/ 26 июля 2018

Я думаю, cancelAcquire() встретится после tryAcquire(arg) броска IllegalMonitorStateException.

...