AbstractQueuedSynchronizer(AQS)鎖狀態(tài)同步和排隊(duì)管理
AbstractQueuedSynchronizer
AbstractQueuedSynchronizer簡(jiǎn)稱(chēng)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ā)獲取鎖的線(xiàn)程進(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)線(xià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)有線(xiàn)程排隊(duì),見(jiàn):java.util.concurrent.locks.AbstractQueuedSynchronizer#enq()
((s = h.next) == null || s.thread != Thread.currentThread());
//
//s.thread != Thread.currentThread() 判斷第一個(gè)排隊(duì)線(xiàn)程是否是當(dāng)前線(xiàn)程
}以上就是AbstractQueuedSynchronizer(AQS)鎖狀態(tài)同步和排隊(duì)管理的詳細(xì)內(nèi)容,更多關(guān)于AbstractQueuedSynchronizer鎖狀態(tài)管理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot使用Redis實(shí)現(xiàn)消息隊(duì)列的方法小結(jié)
在應(yīng)用中把Redis當(dāng)成消息隊(duì)列來(lái)使用已經(jīng)屢見(jiàn)不鮮了,我想主要原因是當(dāng)代應(yīng)用十有八九都會(huì)用到 Redis,因此不用再引入其他消息隊(duì)列系統(tǒng),而且Redis提供了好幾種實(shí)現(xiàn)消息隊(duì)列的方法,用起來(lái)也簡(jiǎn)單,本文給大家介紹了SpringBoot使用Redis實(shí)現(xiàn)消息隊(duì)列的方法小結(jié)2024-04-04
Spring?Boot?接口加解密功能實(shí)現(xiàn)
在我們?nèi)粘5腏ava開(kāi)發(fā)中,免不了和其他系統(tǒng)的業(yè)務(wù)交互,或者微服務(wù)之間的接口調(diào)用;如果我們想保證數(shù)據(jù)傳輸?shù)陌踩?,?duì)接口出參加密,入?yún)⒔饷?,這篇文章主要介紹了Spring?Boot?接口加解密功能實(shí)現(xiàn),需要的朋友可以參考下2023-04-04
Springboot @Validated和@Valid的區(qū)別及使用詳解
這篇文章主要介紹了Springboot @Validated和@Valid的區(qū)別及使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
SpringBoot3集成ip2region實(shí)現(xiàn)離線(xiàn)IP查詢(xún)方案
做后端開(kāi)發(fā),IP歸屬地查詢(xún)絕對(duì)是高頻剛需場(chǎng)景:用戶(hù)訪(fǎng)問(wèn)日志埋點(diǎn)、地域權(quán)限風(fēng)控、用戶(hù)地域畫(huà)像、站點(diǎn)訪(fǎng)問(wèn)統(tǒng)計(jì),幾乎處處都能用得上,本文給大家介紹了如何基于ip2region搭建的離線(xiàn)IP查詢(xún)的方案,需要的朋友可以參考下2026-03-03
Java 實(shí)戰(zhàn)項(xiàng)目錘煉之校園宿舍管理系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+jsp+javaweb+mysql+ajax實(shí)現(xiàn)一個(gè)校園宿舍管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11
try-cache-finally讀取文件錯(cuò)誤try-with-resources使用方法
這篇文章主要為大家介紹了try-cache-finally讀取文件錯(cuò)誤try-with-resources使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02

