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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。