AQS学习记录:一些杂七杂八的个人理解

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

你可能感兴趣的:(java)