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