AQS 各人了解:
一、当线程退出到 CLH 同步队列后,何时出队?
从 relase()办法源码能够看出,它只做了两件事:开释以后线程的持锁,以及唤醒一个后继未勾销节点,并未将以后线程移出 CLH 队列,那么以后持锁线程在开释锁后,是何时真正出队列的呢?
既然开释的时候未出队列,咱们再看看后继节点获取锁的流程,很快,咱们在acquireQueued(final Node node, int arg)
中发现了如下代码,将以后获取锁的 Node 设置为队列的 HEAD,这样,开释锁的 HEAD 节点天然出队,新取得锁的节点升为 HEAD 头节点。这里咱们能够理解到,在 CLH 队列中,持有锁的节点只能是 HEAD 节点。~~~~
if (p == head && tryAcquire(arg)) {setHead(node);
p.next = null; // help GC
failed = false;
return interrupted;
}