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);
}
}
这里的for(;;)不浪费cpu吗???
如果没有这段代码的话你的理解就是对的,但这段代码的功能就是防止你说的情况发生;
它的具体作用简单来说就是判断当前线程是否需要挂起,如果需要的话就会挂起线程等待唤醒或者被中断,在线程被前驱节点唤醒或者被中断之前,会一直阻塞在parkAndCheckInterrupt()处滴