多線程-AQS

AQS是什么?有什么用雁歌?

AQS全稱AbstractQueuedSynchronizer,即抽象的隊(duì)列同步器,是一種用來(lái)構(gòu)建鎖和同步器的框架知残。
基于AQS構(gòu)建的同步器

ReentrantLock
Semaphone
CountDownLatch
ReentrantReadWriteLock
SynchronusQueue
FutureTask

優(yōu)勢(shì)
AQS解決了在實(shí)現(xiàn)同步器時(shí)設(shè)計(jì)的大量細(xì)節(jié)問(wèn)題靠瞎,例如自定義標(biāo)準(zhǔn)同步狀態(tài)、FIFO同步隊(duì)列求妹。
基于AQS來(lái)構(gòu)建同步器可以帶來(lái)很多好處乏盐。它不僅能極大地減少實(shí)現(xiàn)工作,而且也不必處理在多個(gè)位置上發(fā)生的競(jìng)爭(zhēng)問(wèn)題制恍。
它的類(lèi)及類(lèi)結(jié)構(gòu)圖如下:

image.png

image.png

原理
在AQS類(lèi)中維護(hù)了一個(gè)使用雙向鏈表Node實(shí)現(xiàn)的FIFO隊(duì)列父能,用于保存等待的線程,同時(shí)利用一個(gè)int類(lèi)型的state表示狀態(tài)净神,使用時(shí)通過(guò)繼承AQS類(lèi)并實(shí)現(xiàn)它的acquire和release方法來(lái)操作狀態(tài)何吝,來(lái)實(shí)現(xiàn)線程的同步。

以ReentrantLock為例鹃唯,state初始化為0爱榕,表示未鎖定狀態(tài)。A線程lock()時(shí)坡慌,會(huì)調(diào)用tryAcquire()獨(dú)占該鎖并將state+1黔酥。此后,其他線程再tryAcquire()時(shí)就會(huì)失敗洪橘,直到A線程unlock()到state=0(即釋放鎖)為止跪者,其它線程才有機(jī)會(huì)獲取該鎖。當(dāng)然熄求,釋放鎖之前渣玲,A線程自己是可以重復(fù)獲取此鎖的(state會(huì)累加),這就是可重入的概念抡四。但要注意柜蜈,獲取多少次就要釋放多么次,這樣才能保證state是能回到零態(tài)的指巡。

再以CountDownLatch以例淑履,任務(wù)分為N個(gè)子線程去執(zhí)行,state也初始化為N(注意N要與線程個(gè)數(shù)一致)藻雪。這N個(gè)子線程是并行執(zhí)行的秘噪,每個(gè)子線程執(zhí)行完后countDown()一次,state會(huì)CAS(Compare and Swap)減1勉耀。等到所有子線程都執(zhí)行完后(即state=0)指煎,會(huì)unpark()主調(diào)用線程蹋偏,然后主調(diào)用線程就會(huì)從await()函數(shù)返回,繼續(xù)后余動(dòng)作至壤。

image.png

Sync queue:同步隊(duì)列威始,是一個(gè)雙向鏈表。包括head節(jié)點(diǎn)和tail節(jié)點(diǎn)像街。head節(jié)點(diǎn)主要用作后續(xù)的調(diào)度黎棠。
image.png

Condition queue:非必須,單向鏈表镰绎。當(dāng)程序中存在condition的時(shí)候才會(huì)存在此鏈表中脓斩。
image.png

不同組件的使用

CountDownLatch

主要用于等待線程等待其它線程執(zhí)行后再執(zhí)行,其實(shí)現(xiàn)是通過(guò)控制計(jì)數(shù)器是否遞減到0來(lái)判斷畴栖,其它的每一個(gè)線程執(zhí)行完畢后随静,調(diào)用countDown()方法讓計(jì)數(shù)器減1,等待線程調(diào)用await()方法吗讶,直到計(jì)數(shù)器為1再執(zhí)行燎猛。

CyclicBarrier

用于等待多個(gè)線程都準(zhǔn)備好再進(jìn)行,每一個(gè)線程準(zhǔn)別好后关翎,計(jì)數(shù)器加1扛门,加到指定值后全部開(kāi)始。

Semaphore

用于控制某個(gè)資源同時(shí)可被訪問(wèn)的個(gè)數(shù)纵寝,如控制數(shù)據(jù)庫(kù)資源可以同時(shí)并發(fā)數(shù)量為20.

ReentrantReadWriteLock

讀寫(xiě)鎖论寨,用于需要同步資源時(shí)在前后加鎖/解鎖,當(dāng)一個(gè)線程獲取讀鎖后其它線程可以繼續(xù)獲取讀鎖爽茴,當(dāng)一個(gè)線程獲取寫(xiě)鎖后其它線程都需等待葬凳,因此,可能造成寫(xiě)鎖饑餓室奏,就是寫(xiě)鎖一直無(wú)法獲取火焰。

StampLock

類(lèi)似讀寫(xiě)鎖的功能和使用方法,不過(guò)有一下兩點(diǎn)不同:

  • 每次獲取鎖會(huì)得到一個(gè)long類(lèi)型的stamp的返回值胧沫,解鎖時(shí)需要將其回傳昌简。
  • 有樂(lè)觀讀操作,適合讀多寫(xiě)少情況绒怨,指當(dāng)資源被讀鎖鎖定時(shí)纯赎,會(huì)根據(jù)資源是否被變更,進(jìn)行讀取操作南蹂,而不是不允許讀操作犬金。

Condition

配合AQS鎖實(shí)現(xiàn)的線程中斷/等待機(jī)制,將等待的線程移入condition維護(hù)的隊(duì)列,并通過(guò)condition控制中斷/等待晚顷。

參考文章
https://www.xuxueli.com/blog/
https://juejin.im/post/5d08a0be6fb9a07edd2a1438

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末峰伙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子该默,更是在濱河造成了極大的恐慌瞳氓,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栓袖,死亡現(xiàn)場(chǎng)離奇詭異顿膨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)叽赊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)必搞,“玉大人必指,你說(shuō)我怎么就攤上這事∷≈蓿” “怎么了塔橡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)霜第。 經(jīng)常有香客問(wèn)我葛家,道長(zhǎng),這世上最難降的妖魔是什么泌类? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任癞谒,我火速辦了婚禮,結(jié)果婚禮上刃榨,老公的妹妹穿的比我還像新娘弹砚。我一直安慰自己,他們只是感情好枢希,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布桌吃。 她就那樣靜靜地躺著,像睡著了一般苞轿。 火紅的嫁衣襯著肌膚如雪茅诱。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天搬卒,我揣著相機(jī)與錄音瑟俭,去河邊找鬼。 笑死秀睛,一個(gè)胖子當(dāng)著我的面吹牛尔当,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼椭迎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锐帜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起畜号,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缴阎,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后简软,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蛮拔,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痪枫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年凶赁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枝嘶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苗桂。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡事示,死狀恐怖枯途,靈堂內(nèi)的尸體忽然破棺而出刊棕,到底是詐尸還是另有隱情钢猛,我是刑警寧澤察郁,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布衍慎,位于F島的核電站,受9級(jí)特大地震影響皮钠,放射性物質(zhì)發(fā)生泄漏稳捆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一麦轰、第九天 我趴在偏房一處隱蔽的房頂上張望乔夯。 院中可真熱鬧,春花似錦款侵、人聲如沸驯嘱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鞠评。三九已至,卻和暖如春壕鹉,著一層夾襖步出監(jiān)牢的瞬間剃幌,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工晾浴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留负乡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓脊凰,卻偏偏與公主長(zhǎng)得像抖棘,于是被迫代替她去往敵國(guó)和親茂腥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容