⑤. addWaiter(Node.EXCLUSIVE)
假如3号ThreadC线程进来
(1). prev
(2). compareAndSetTail
(3). next
①. addWaiter(Node mode )
双向链表中,第一个节点为虚节点(也叫哨兵节点),其实并不存储任何信息,只是占位。 真正的第一个有数据的节点,是从第二个节点开始的
②. enq(node);
③. B、C线程都排好队了效果图如下:
⑥.acquireQueued(addWaiter(Node.EXCLUSIVE), arg)
- ①. acquireQueued
(会调用如下方法:shouldParkAterFailedAcquire和parkAndCheckInterrupt | setHead(node) )
- ②. shouldParkAfterFailedAcquire
③. parkAndCheckInterrupt
④. 当我们执行下图中的③表示线程B或者C已经获取了permit了
⑤. setHead( )方法
代码执行完毕后,会出现如下图所示