初窺AbstractQueuedSynchronizer(未完待續(xù))

前言: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組件
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容