AbstractQueuedSynchronizer(AQS)鎖狀態(tài)同步和排隊管理
AbstractQueuedSynchronizer
AbstractQueuedSynchronizer簡稱AQS,ReentrantLock,ReentrantReadWriteLock,CountDownLatch,Semaphore等等這些鎖都是基于AQS實現(xiàn)的。
AQS核心主要實現(xiàn)了鎖的狀態(tài)的同步,隊列排隊、喚醒管理,鎖的釋放等底層功能。
主要基于state屬性來控制鎖的可用狀態(tài),通過維護(hù)一個CLH雙向鏈表隊列來管理并發(fā)獲取鎖的線程進(jìn)行排隊。
主要屬性
/** * 隊列頭節(jié)點,延遲初始化,除了初始化時僅能通過setHead方法修改 */ private transient volatile Node head; /** * 隊列尾節(jié)點,延遲初始化,僅通過enq方法修改添加等待節(jié)點 */ private transient volatile Node tail; /** * 同步器狀態(tài) */ private volatile int state;
CLH隊列節(jié)點屬性
static final class Node { /** 共享鎖標(biāo)記 */ static final Node SHARED = new Node(); /** 獨占鎖標(biāo)記 */ static final Node EXCLUSIVE = null; /** 節(jié)點取消排隊,可能由于超時或者中斷 */ static final int CANCELLED = 1; /** 當(dāng)前節(jié)點的下個節(jié)點是阻塞或即將阻塞,當(dāng)節(jié)點釋放鎖或取消時應(yīng)該喚醒unpark下個節(jié)點 */ static final int SIGNAL = -1; /** 條件隊列節(jié)點 */ static final int CONDITION = -2; /** * 標(biāo)識下個節(jié)點無條件傳播(適用與共享鎖) */ static final int PROPAGATE = -3; //節(jié)點等待狀態(tài),0,CANCELLED,SIGNAL,CONDITION,PROPAGATE volatile int waitStatus; //上個節(jié)點 volatile Node prev; //下個節(jié)點 volatile Node next; //節(jié)點線程 volatile Thread thread; /** * 共享鎖時值為 SHARED * 條件隊列時指向條件隊列下個節(jié)點 */ Node nextWaiter;
主要流程
核心方法
//判斷當(dāng)前請求是否需要排隊 public final boolean hasQueuedPredecessors() { Node t = tail;//尾節(jié)點 Node h = head;//頭節(jié)點 Node s; return h != t &&//h==t時代表沒有線程排隊,見:java.util.concurrent.locks.AbstractQueuedSynchronizer#enq() ((s = h.next) == null || s.thread != Thread.currentThread()); // //s.thread != Thread.currentThread() 判斷第一個排隊線程是否是當(dāng)前線程 }
以上就是AbstractQueuedSynchronizer(AQS)鎖狀態(tài)同步和排隊管理的詳細(xì)內(nèi)容,更多關(guān)于AbstractQueuedSynchronizer鎖狀態(tài)管理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot中nacos-client獲取配置的實現(xiàn)方法
本文主要介紹了springboot中nacos-client獲取配置的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04使用Idea簡單快速搭建springcloud項目的圖文教程
這篇文章主要介紹了使用Idea簡單快速搭建springcloud項目,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01Java使用選擇排序法對數(shù)組排序?qū)崿F(xiàn)代碼
這篇文章主要介紹了Java使用選擇排序法對數(shù)組排序?qū)崿F(xiàn)代碼,需要的朋友可以參考下2014-02-02SpringBoot應(yīng)用監(jiān)控帶郵件警報的實現(xiàn)示例
本文主要介紹了SpringBoot應(yīng)用監(jiān)控帶郵件警報的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02高內(nèi)聚低耦合原則_動力節(jié)點Java學(xué)院整理
耦合度就是某模塊(類)與其它模塊(類)之間的關(guān)聯(lián)、感知和依賴的程度,是衡量代碼獨立性的一個指標(biāo),也是軟件工程設(shè)計及編碼質(zhì)量評價的一個標(biāo)準(zhǔn)2017-08-08java實現(xiàn)人民幣大小寫轉(zhuǎn)換方法分享
本文介紹java人民幣數(shù)字大小寫轉(zhuǎn)換方法,代碼中有注釋,大家直接看代碼吧2014-01-01