Java 鎖體系演進:同步鎖 vs JUC 鎖
Java 鎖發展歷經兩個階段:
- 同步鎖(synchronized):JDK 1.0 內置,基於對象監視器,語法簡單但功能受限
- JUC 鎖(java.util.concurrent.locks):JDK 1.5 引入,提供豐富語義(公平/非公平、可重入、讀寫分離、可中斷、超時獲取等),靈活性大幅提升
JUC 鎖核心組件架構

1. Lock 接口:鎖語義的統一定義
定義了鎖的基本操作規範,支援多種語義變體:
- 公平/非公平獲取策略
- 可重入特性
- 可中斷、可超時、可輪詢獲取
2. ReadWriteLock:讀寫分離鎖
唯一實現類 ReentrantReadWriteLock,核心設計:
- ReadLock(共享鎖):多線程可同時持有,適合讀多寫少場景
- WriteLock(獨占鎖):獨占訪問,與讀鎖、寫鎖互斥
3. AQS 三大抽象類:同步器基石
| 類名 | 角色定位 |
| AbstractOwnableSynchronizer | 記錄獨占同步線程的基礎類 |
| AbstractQueuedSynchronizer (AQS) | 核心同步框架,基於 FIFO 隊列管理線程阻塞/喚醒 |
| AbstractQueuedLongSynchronizer | AQS 64位狀態擴展版 |
所有 JUC 同步組件(ReentrantLock、CountDownLatch、Semaphore 等)均基於 AQS 構建。
4. LockSupport:線程阻塞原語
提供 park()/unpark() 替代已棄用的 Thread.suspend/resume,避免死鎖風險,是 AQS 阻塞機制的底層支撐。
5. Condition:條件變量
替代 Object 監視器方法,支援:
- 單一 Lock 關聯多個 Condition
await()/signal() 精準線程通信
- 避免兼容性問題的方法命名差異
6. ReentrantLock:獨占鎖標杆實現

- 實現 Lock 接口
- 內部聚合 Sync 抽象類(繼承 AQS)
- FairSync/NonfairSync 兩種具體策略,預設非公平
7. ReentrantReadWriteLock:讀寫鎖實現

- 實現 ReadWriteLock 接口
- 包含 readerLock/WriteLock 兩個 Lock 實現
- 同樣基於 AQS,支援公平/非公平模式
8. 同步工具類三劍客
| 組件 | 核心機制 | 適用場景 |
| CountDownLatch | AQS 共享模式,計數器不可重置 | 主線程等待多任務完成 |
| CyclicBarrier | ReentrantLock + Condition,計數器可重置 | 多線程相互等待屏障點 |
| Semaphore | AQS 共享模式,許可證計數 | 資源池訪問控制、限流 |
架構設計精髓
- 模板方法模式:AQS 定義同步流程骨架,子類實現
tryAcquire/tryRelease 等鉤子方法
- 狀態封裝:用 volatile int state 表示同步狀態(鎖計數、許可證數等)
- 隊列管理:CLH 變體隊列實現線程排隊、阻塞、喚醒
- CAS 原子操作:非公平鎖獲取、state 更新均依賴 CAS
掌握 JUC 鎖框架,不僅能靈活選型,更能深入理解 Java 並發編程的底層邏輯。