首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java JUC鎖框架全景圖譜:從AQS到ReentrantLock、ReadWriteLock核心架構解析

     編輯:Java 相關知識

Java 鎖體系演進:同步鎖 vs JUC 鎖

Java 鎖發展歷經兩個階段:

  • 同步鎖(synchronized):JDK 1.0 內置,基於對象監視器,語法簡單但功能受限
  • JUC 鎖(java.util.concurrent.locks):JDK 1.5 引入,提供豐富語義(公平/非公平、可重入、讀寫分離、可中斷、超時獲取等),靈活性大幅提升

JUC 鎖核心組件架構

JUC鎖框架圖

1. Lock 接口:鎖語義的統一定義

定義了鎖的基本操作規範,支援多種語義變體:

  • 公平/非公平獲取策略
  • 可重入特性
  • 可中斷、可超時、可輪詢獲取

2. ReadWriteLock:讀寫分離鎖

唯一實現類 ReentrantReadWriteLock,核心設計:

  • ReadLock(共享鎖):多線程可同時持有,適合讀多寫少場景
  • WriteLock(獨占鎖):獨占訪問,與讀鎖、寫鎖互斥

3. AQS 三大抽象類:同步器基石

類名角色定位
AbstractOwnableSynchronizer記錄獨占同步線程的基礎類
AbstractQueuedSynchronizer (AQS)核心同步框架,基於 FIFO 隊列管理線程阻塞/喚醒
AbstractQueuedLongSynchronizerAQS 64位狀態擴展版

所有 JUC 同步組件(ReentrantLock、CountDownLatch、Semaphore 等)均基於 AQS 構建。

4. LockSupport:線程阻塞原語

提供 park()/unpark() 替代已棄用的 Thread.suspend/resume,避免死鎖風險,是 AQS 阻塞機制的底層支撐。

5. Condition:條件變量

替代 Object 監視器方法,支援:

  • 單一 Lock 關聯多個 Condition
  • await()/signal() 精準線程通信
  • 避免兼容性問題的方法命名差異

6. ReentrantLock:獨占鎖標杆實現

ReentrantLock UML

  • 實現 Lock 接口
  • 內部聚合 Sync 抽象類(繼承 AQS)
  • FairSync/NonfairSync 兩種具體策略,預設非公平

7. ReentrantReadWriteLock:讀寫鎖實現

ReentrantReadWriteLock UML

  • 實現 ReadWriteLock 接口
  • 包含 readerLock/WriteLock 兩個 Lock 實現
  • 同樣基於 AQS,支援公平/非公平模式

8. 同步工具類三劍客

組件核心機制適用場景
CountDownLatchAQS 共享模式,計數器不可重置主線程等待多任務完成
CyclicBarrierReentrantLock + Condition,計數器可重置多線程相互等待屏障點
SemaphoreAQS 共享模式,許可證計數資源池訪問控制、限流

架構設計精髓

  1. 模板方法模式:AQS 定義同步流程骨架,子類實現 tryAcquire/tryRelease 等鉤子方法
  2. 狀態封裝:用 volatile int state 表示同步狀態(鎖計數、許可證數等)
  3. 隊列管理:CLH 變體隊列實現線程排隊、阻塞、喚醒
  4. CAS 原子操作:非公平鎖獲取、state 更新均依賴 CAS

掌握 JUC 鎖框架,不僅能靈活選型,更能深入理解 Java 並發編程的底層邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved