Я изучаю исходный код класса 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
метод