例如 ReentrantLock、CountDownLatch、CycleBarrier 底層都是通過(guò)AQS來(lái)實(shí)現(xiàn)的
AQS的核心思想:如果被請(qǐng)求的共享資源空閑,則將當(dāng)前請(qǐng)求的資源的線程設(shè)置為有效的工作線程,并將共享資源設(shè)置為鎖定狀態(tài),如果被請(qǐng)求的共享資源被占用,那么就需要一套線程阻塞等待以及喚醒時(shí)鎖分配的機(jī)制,這個(gè)AQS是用CLH隊(duì)列鎖實(shí)現(xiàn)的,即將暫時(shí)獲取不到的鎖的線程加入到隊(duì)列中。CLH隊(duì)列是一個(gè)虛擬的雙向隊(duì)列,虛擬的雙向隊(duì)列即不存在隊(duì)列的實(shí)例,僅存在節(jié)點(diǎn)之間的關(guān)聯(lián)關(guān)系。
AQS是將每一條請(qǐng)求共享資源的線程封裝成一個(gè)CLH鎖隊(duì)列的一個(gè)結(jié)點(diǎn)(Node),來(lái)實(shí)現(xiàn)鎖的分配
用大白話來(lái)說(shuō),AQS就是基于CLH隊(duì)列,用volatile修飾共享變量state,線程通過(guò)CAS去改變狀態(tài)符,成功則獲取鎖成功,失敗則進(jìn)入等待隊(duì)列,同時(shí)等待被喚醒。
注意:AQS是自旋鎖,在等待喚醒的時(shí)候,經(jīng)常會(huì)使用自旋的方式,不斷的嘗試獲取鎖,直到被其它線程獲取成功
實(shí)現(xiàn)了AQS的鎖有:自旋鎖、互斥鎖、讀寫(xiě)鎖、條件變量、信號(hào)量、柵欄都是AQS的衍生物