1、AQS簡介html
AbstractQueuedSynchronizer 抽象隊列同步器。簡稱AQS,同時擁有 同步隊列 與 等待隊列java
2、源碼淺析node
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. 總結ui
if (!hasQueuedPredecessors()...
3、工具類this
轉載請註明地址:https://www.cnblogs.com/handsomecui/p/14253284.html線程