概念
AQS(AbstractQueuedSynchronizer)
是并發包(java.util.concurrent)的核心組件,用于構建鎖和同步器(如
ReentrantLock、Semaphore、CountDownLatch 等)。它通過維護一個 CLH 隊列 和
同步狀態(state) 實現高效的線程協作。
核心設計思想
同步狀態(state):一個 volatile int 變量,表示資源的可用數量(如鎖是否被持有、信號量剩余許可數)。
CLH隊列:管理等待獲取資源的線程,隊列中的節點(Node)保存線程引用和等待狀態。
模板方法模式:AQS 提供基礎框架,子類通過實現 tryAcquire/tryRelease 等方法定義具體邏輯
兩種同步模式
獨占模式(Exclusive):同一時刻僅一個線程能獲取資源(如 ReentrantLock)。
公平鎖:按照線程在隊列中的排隊順序,先到者先拿到鎖
非公平鎖:當線程要獲取鎖時,無視隊列順序直接去搶鎖,誰搶到就是誰的
共享模式(Shared):允許多個線程同時獲取資源(如 Semaphore、CountDownLatch)。
核心要點
狀態原子性:通過volatile+CAS保證
隊列管理:雙向CLH隊列+自旋優化
線程調度:LockSupport精確控制阻塞/喚醒