在單純地使用鎖,比如reentrantlock
的時候,這個鎖元件內部有乙個繼承同步器aqs的類,實現了其抽象方法,加鎖、釋放鎖也只是涉及到aqs中的同步佇列而已,那麼等待佇列又是什麼呢?
當使用condition
的時候,等待佇列的概念就出來了。condition的獲取一般都要與乙個鎖lock相關,乙個鎖上面可以生產多個condition。
condition介面的主要實現類是aqs的內部類conditionobject
,每個condition物件都包含乙個等待佇列。該佇列是condition物件實現等待/通知的關鍵。aqs中同步佇列與等待佇列的關係如下:
在object的監視器模型上,乙個物件擁有乙個同步佇列與乙個等待佇列,而aqs擁有乙個同步佇列和多個等待佇列。
object的監視器模型如下:
呼叫condition的await方法,將會使當前執行緒進入等待佇列並釋放鎖(先加入等待佇列再釋放鎖),同時執行緒狀態轉為等待狀態。
從同步佇列和阻塞佇列的角度看,呼叫await方法時,相當於同步佇列的首節點移到condition的等待佇列中
呼叫condition的signal方法時,將會把等待佇列的首節點移到等待佇列的尾部,然後喚醒該節點。
被喚醒,並不代表就會從await方法返回,也不代表該節點的執行緒能獲取到鎖,它一樣需要加入到鎖的競爭acquirequeued方法中去,只有成功競爭到鎖,才能從await方法返回。
抽象佇列同步器AQS
aqs具體實現及內部原理 aqs同步佇列具體實現結構 private volatile int state 共享變數,使用volatile修飾保證執行緒可見性share共享 多個執行緒可同時執行,如reentrantreadwritelock.readlock cyclicbarrier count...
AQS 同步佇列共享模式
首先來看看acquireshared public final void acquireshared int arg tryacquireshared 方法同樣由自定義同步器實現,用來給state原子的加一些操作。如果tryacquireshared 0說明當前執行緒嘗試獲取資源失敗需要進入同步佇列...
簡單理解AQS ( 抽象的佇列同步器)
abstractqueuedsynchronizer 類如其名,抽象的佇列式的同步器,aqs 定義了一套多執行緒訪問共享資源的同步器框架,許多同步類實現都依賴於它,如常用的 reentrantlock semaphore countdownlatch。exclusive 獨佔,只有乙個執行緒能執行,...