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