1.基于Aqs框架,内部声明静态内部类Syns继承AbstractQueuedSynchronizer,重写了tryAcquireShared和tryReleaseShared方法
,内部调用tryAcquireShared和doAcquireSharedInterruptibly方法
doAcquireSharedInterruptibly的实现采用的是AQSCLH隐式双向链表队列,每个Node维护着一个Thread对象,首先将当前Node插入队尾,查看自己优先权,如果前面不是队列头部,并且当前state值是否为0,如果是则唤醒后面节点(每个Node有个next指向下个,调用LockSupport.unpark(next.thread))去唤醒,否则的话执行LockSupport.park(this)阻塞当前线程
private Node addWaiter(Node mode) {
Node node = new Node(Thread.currentThread(), mode);
// Try the fast path of enq; backup to full enq on failure
Node pred = tail;
//队尾不为空
if (pred != null) {
//node的前驱变成tail
node.prev = pred;
//cas将tail设置为当前node
if (compareAndSetTail(pred, node)) {
//pred.就是之前的尾部,下一个指针指向当前node
pred.next = node;
return node;
}
}
//如果是空,执行enq去新建立一个头和尾
enq(node);
return node;
}
private Node enq(final Node node) {
for (;;) {