Где AbstractQueuedSynchronizer меняет свою ссылку на голову в эксклюзивном режиме - PullRequest
0 голосов
/ 17 апреля 2019

Я изучаю исходный код класса AbstractQueuedSynchronizer, когда читаю код метода acquireQueued:

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

оператор final Node p = node.predecessor(); означает получить предыдущий узел текущего узла p. следующий оператор if попытается сравнить узел p и узел head.

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

Кажется, я не могу найти блок кода в shouldParkAfterFailedAcquire / parkAndCheckInterrupt / release / unparkSuccessor метод

...