一、AQS简介
AbstractQueuedSynchronizer 抽象队列同步器。简称AQS,同时拥有 同步队列 与 等待队列

二、源码浅析
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
2. 等待队列
调用 await 方法,进入condition的等待队列,释放锁,进入一个 while 循环,只有当线程回到同步队列或者被中断才可以跳出while,while里面 park 掉线程 ----- 在 condition调用 signal 之后,该condition上面的节点的 firstWaiter 首先加入到 同步队列尾部 , 会 unpark 线程,退出 while 之后,又会进入 acquireQueued 的循环里面,同样存在之前的逻辑。
public final void await() throws InterruptedException {
if (Thread.interrupted())
throw new InterruptedException();
Node node = addConditionWaiter();
int savedState = fullyRelease(node);
int interruptMode = 0;
while (!isOnSyncQueue(node)) {
LockSupport.park(this);
if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
break;
}
if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
interruptMode = REINTERRUPT;
if (node.nextWaiter != null) // clean up if cancelled
unlinkCancelledWaiters();
if (interruptMode != 0)
reportInterruptAfterWait(interruptMode);
}
3. 总结
if (!hasQueuedPredecessors()...
三、工具类

转载请注明地址:https://www.cnblogs.com/handsomecui/p/14253284.html
原文:https://www.cnblogs.com/handsomecui/p/14253284.html