什么是AQS嘁捷?
AQS(Abustact Queued Synchronizer 抽象隊(duì)列化同步器)是用來為Java的并發(fā)同步組件提供統(tǒng)一的底層支持,例如 ReentrantLock, CountdowLatch
都是基于 AQS 實(shí)現(xiàn)的显熏。
AQS有2個重要組成部分:
- state 同步狀態(tài)普气,int 類型
- 一個同步隊(duì)列
當(dāng)一個線程嘗試獲取鎖時,如果已經(jīng)被占用佃延,此線程就作為一個節(jié)點(diǎn)添加到隊(duì)尾现诀,對頭是成功獲取鎖的節(jié)點(diǎn),對頭釋放鎖后履肃,會喚醒后面的節(jié)點(diǎn)仔沿,并出隊(duì)。
資源共享方式
AQS定義了2種共享方式:
- 獨(dú)占
- 共享
獲取鎖和釋放鎖的流程:
- 獲取鎖
調(diào)用獲取方法尺棋,如果成功則返回封锉,否則構(gòu)造node節(jié)點(diǎn)加入到隊(duì)尾,以自旋的方式判斷是否可以成為頭節(jié)點(diǎn)膘螟,如果不能成福,就進(jìn)入等待狀態(tài)。
- 釋放鎖
調(diào)用釋放方法荆残,獲取當(dāng)前節(jié)點(diǎn)的下一個節(jié)點(diǎn)奴艾,喚醒后面的節(jié)點(diǎn)。
在細(xì)節(jié)上2中方式有一些差異:
- 獨(dú)占鎖中 state 為1内斯,代表一次只能一個線程執(zhí)行蕴潦,而在共享鎖中 state > 1,同時可以有多個線程成功獲取同步狀態(tài)俘闯。
- 釋放鎖時潭苞,獨(dú)占鎖只喚醒后面的那一個節(jié)點(diǎn),因?yàn)?state 為 1真朗,叫醒一個就夠了此疹,而共享鎖會喚醒后面所有節(jié)點(diǎn),因?yàn)?state > 1,把后面的都喚醒蝗碎,至于哪些線程能獲取同步狀態(tài)就看他們自己的了振诬。