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ì),見: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-11
springboot中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-01
Java使用選擇排序法對(duì)數(shù)組排序?qū)崿F(xiàn)代碼
這篇文章主要介紹了Java使用選擇排序法對(duì)數(shù)組排序?qū)崿F(xiàn)代碼,需要的朋友可以參考下2014-02-02
SpringBoot應(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-08
java實(shí)現(xiàn)人民幣大小寫轉(zhuǎn)換方法分享
本文介紹java人民幣數(shù)字大小寫轉(zhuǎn)換方法,代碼中有注釋,大家直接看代碼吧2014-01-01

