全國(guó)咨詢(xún)/投訴熱線:400-618-4000

首頁(yè)技術(shù)文章正文

Java AQS是什么?如何理解AQS?

更新時(shí)間:2020-12-08 來(lái)源:黑馬程序員 瀏覽量:

1577370495235_學(xué)IT就到黑馬程序員.gif

AQS(AbstractQueuedSynchronizer類(lèi))是一個(gè)用來(lái)構(gòu)建鎖和同步器的框架,各種Lock包中的鎖(常用的有Reentrantlock、ReadWritelock),以及其他如 Semaphore、CountDownlatch,甚至是早期的FutureTask等,都是基于AQS來(lái)構(gòu)建。


1.AQS在內(nèi)部定義了一個(gè)volatile int state變量,表示同步狀態(tài):當(dāng)線程調(diào)用lock方法時(shí),如果state=0,說(shuō)明沒(méi)有任何線程占有共享資源的鎖,可以獲得鎖并將state=1;如果state=1,則說(shuō)明有線程目前正在使用共享變量,其他線程必須加入同步隊(duì)列進(jìn)行等待。


2.AQs通過(guò)Node內(nèi)部類(lèi)構(gòu)成的一個(gè)雙向鏈表結(jié)構(gòu)的同步隊(duì)列,來(lái)完成線程獲取鎖的排隊(duì)工作,當(dāng)有線程獲取鎖失敗后,就被添加到隊(duì)列未尾。

·Node類(lèi)是對(duì)要訪問(wèn)同步代碼的線程的封裝,包含了線程本身及其狀態(tài)叫Waitstatus(有五種不同取值,分別表示是否被阻塞,是否等待喚醒,是否已經(jīng)被取消等),每個(gè)Noe結(jié)點(diǎn)關(guān)聯(lián)其prev結(jié)點(diǎn)和next結(jié)點(diǎn),方便線程釋放鎖后快速喚醒下一個(gè)在等待的線程,是一個(gè)FIFO的過(guò)程。

·Node類(lèi)有兩個(gè)常量,SHARED和CLUSIVE,分別代表共享模式和獨(dú)占模式。所謂共亨模式是一個(gè)鎖允許多條線程同時(shí)操作(信號(hào)量Semaphore就是基于A○S的共享模式實(shí)現(xiàn)的),獨(dú)占模式是同一個(gè)時(shí)間段只能有一個(gè)線程對(duì)共享資源進(jìn)行操作,多余的請(qǐng)求線程需要排隊(duì)等待(如ReentranLock)。


3.AQS通過(guò)內(nèi)部類(lèi)Conditionobject構(gòu)建等待隊(duì)列(可有多個(gè)),當(dāng)Condition調(diào)用Wat()方法后,線程將會(huì)加入等待隊(duì)列中,而當(dāng)Condition調(diào)用signal()方法后,線程將從等待隊(duì)列轉(zhuǎn)移動(dòng)同步隊(duì)列中進(jìn)鎖竟?fàn)帯?


4.AQS和Condition各自維護(hù)了不同的隊(duì)列,在使用Lock和Condition的時(shí)候,其實(shí)就是兩個(gè)隊(duì)列的互相移動(dòng)。


猜你喜歡:

Spring Cloud Hystrix原理詳細(xì)介紹

openresty安裝使用教程

Java中final關(guān)鍵字如何使用?

Java高級(jí)軟件工程師培訓(xùn)課程

分享到:
在線咨詢(xún) 我要報(bào)名
和我們?cè)诰€交談!