更新時間:2020-12-08 來源:黑馬程序員 瀏覽量:
AQS(AbstractQueuedSynchronizer類)是一個用來構(gòu)建鎖和同步器的框架,各種Lock包中的鎖(常用的有Reentrantlock、ReadWritelock),以及其他如 Semaphore、CountDownlatch,甚至是早期的FutureTask等,都是基于AQS來構(gòu)建。
1.AQS在內(nèi)部定義了一個volatile int state變量,表示同步狀態(tài):當(dāng)線程調(diào)用lock方法時,如果state=0,說明沒有任何線程占有共享資源的鎖,可以獲得鎖并將state=1;如果state=1,則說明有線程目前正在使用共享變量,其他線程必須加入同步隊(duì)列進(jìn)行等待。
2.AQs通過Node內(nèi)部類構(gòu)成的一個雙向鏈表結(jié)構(gòu)的同步隊(duì)列,來完成線程獲取鎖的排隊(duì)工作,當(dāng)有線程獲取鎖失敗后,就被添加到隊(duì)列未尾。
·Node類是對要訪問同步代碼的線程的封裝,包含了線程本身及其狀態(tài)叫Waitstatus(有五種不同取值,分別表示是否被阻塞,是否等待喚醒,是否已經(jīng)被取消等),每個Noe結(jié)點(diǎn)關(guān)聯(lián)其prev結(jié)點(diǎn)和next結(jié)點(diǎn),方便線程釋放鎖后快速喚醒下一個在等待的線程,是一個FIFO的過程。
·Node類有兩個常量,SHARED和CLUSIVE,分別代表共享模式和獨(dú)占模式。所謂共亨模式是一個鎖允許多條線程同時操作(信號量Semaphore就是基于A○S的共享模式實(shí)現(xiàn)的),獨(dú)占模式是同一個時間段只能有一個線程對共享資源進(jìn)行操作,多余的請求線程需要排隊(duì)等待(如ReentranLock)。
3.AQS通過內(nèi)部類Conditionobject構(gòu)建等待隊(duì)列(可有多個),當(dāng)Condition調(diào)用Wat()方法后,線程將會加入等待隊(duì)列中,而當(dāng)Condition調(diào)用signal()方法后,線程將從等待隊(duì)列轉(zhuǎn)移動同步隊(duì)列中進(jìn)鎖竟?fàn)帯?
4.AQS和Condition各自維護(hù)了不同的隊(duì)列,在使用Lock和Condition的時候,其實(shí)就是兩個隊(duì)列的互相移動。
猜你喜歡:
【AI設(shè)計(jì)】北京143期畢業(yè)僅36天,全員拿下高薪offer!黑馬AI設(shè)計(jì)連續(xù)6期100%高薪就業(yè)
2025-09-19【跨境電商運(yùn)營】深圳跨境電商運(yùn)營畢業(yè)22個工作日,就業(yè)率91%+,最高薪資達(dá)13500元
2025-09-19【AI運(yùn)維】鄭州運(yùn)維1期就業(yè)班,畢業(yè)14個工作日,班級93%同學(xué)已拿到Offer, 一線均薪資 1W+
2025-09-19【AI鴻蒙開發(fā)】上海校區(qū)AI鴻蒙開發(fā)4期5期,距離畢業(yè)21天,就業(yè)率91%,平均薪資14046元
2025-09-19【AI大模型開發(fā)-Python】畢業(yè)33個工作日,就業(yè)率已達(dá)到94.55%,班均薪資20763元
2025-09-19【AI智能應(yīng)用開發(fā)-Java】畢業(yè)當(dāng)天offer率91%,薪資1W+占比54.2%,班級均薪12k+
2025-09-19