抽象佇列同步器
AQS是AbstractQueuedSynchronizer的縮寫,即抽象佇列同步器,是Java並發包java.util.concurrent.lock下的一個核心同步器框架。
AQS被設計用來構建鎖和其他同步組件,如ReentrantLock、ReentrantReadWriteLock、Semaphore等,它通過維護一個共享資源狀態(Volatile Int State)和一個先進先出(FIFO)的執行緒等待佇列來實現多執行緒訪問共享資源的同步,AQS的核心思想是,如果被請求的共享資源空閒,則將當前請求資源的執行緒設定為有效的工作執行緒,並且將共享資源設定為鎖定狀態。如果被請求的共享資源被占用,那麼就需要一套執行緒阻塞等待以及被喚醒時鎖分配的機制,這個機制AQS是用CLH佇列鎖實現的,即將暫時獲取不到鎖的執行緒加入到佇列中。
CLH(Craig, Landin, and Hagersten)佇列是一個虛擬的雙向佇列,即不存在佇列實例,僅存在節點之間的關聯關係。AQS是將每條請求共享資源的執行緒封裝成一個CLH鎖佇列的一個節點(Node)來實現鎖的分配。AQS使用一個int成員變數來表示同步狀態,通過內置的FIFO佇列來完成獲取資源執行緒的排隊工作。AQS使用CAS(Compare and Swap)對該同步狀態進行原子操作實現對其值的修改。