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