前言:AQS是J.U.C提供給我們的核心基礎組件,可以用它來構建鎖和其他裝置的基礎框架,今天并不是對AQS進行深入的分析,只是從大體上對它有一個初步的認識,更加詳細的分析會在后面的文章中不定時更新。
首先看一下AQS中的主要的數據結構

AQS.png
簡單概括一下AQS的幾個特性
- 使用Node實現FIFO隊列,可以用于構建鎖和其他裝置的基礎框架
- 利用了一個int類型的變量state來表示狀態(tài),state的值為0的時候表示沒有線程獲取鎖,1的時候表示有線程獲取鎖,大于1的時候表示獲得重入鎖的數量
- 使用它的方法是繼承,基于模版方法設計,子類通過繼承并通過實現它的方法管理其狀態(tài)(acquire 和 release)
- 可以同時實現拍他鎖和共享鎖模式(獨占、共享),子類實現要么使用獨占鎖API要么使用共享鎖API,站在使用者的角度來看不會同時使用兩者。即便是最有名的子類ReentrantLock也是通過兩個內部類讀鎖和寫鎖分別實現的兩套API來實現的。
AQS實現的大體思路(重點)
首先AQS維護了一個CLH隊列來管理鎖,線程會嘗試獲取鎖,如果失敗了,就將當前線程以及等待狀態(tài)等信息包成一個NODE節(jié)點,加入到同步隊列SyncQueue中,之后會不斷循環(huán)嘗試獲取鎖,條件是當前節(jié)點為head的直接后繼才會嘗試,如果失敗就會阻塞自己直到自己被喚醒,而當持有鎖的線程釋放鎖的時候,才會釋放隊列中阻塞的線程。
AQS的同步組件(后面會對具體的組件進行詳細分析)
- CountDownLatch
- Semaphore
- CyclicBarrier
- ReentrantLock
- Condition組件
- FutureTask組件