synchronized 雖簡單但功能受限(不可中斷、非公平、無條件等待)。JDK 5 引入 java.util.concurrent.locks.Lock 接口及實現類,提供可中斷、可超時、公平/非公平、多條件隊列、讀寫分離等高級特性,底層基於 AQS (AbstractQueuedSynchronizer) 框架構建。
| 方法 | 語義 |
|---|---|
lock() | 獲取鎖,阻塞直到成功 |
lockInterruptibly() | 可中斷獲取鎖,響應 Thread.interrupt() |
tryLock() | 嘗試非阻塞獲取,立即返回成功/失敗 |
tryLock(timeout, unit) | 超時獲取,支援中斷 |
unlock() | 釋放鎖 |
newCondition() | 創建綁定該鎖的 Condition 對象(多條件隊列) |
| 特性 | synchronized | ReentrantLock | ReentrantReadWriteLock |
|---|---|---|---|
| 可重入性 | ✅ | ✅ | ✅ (讀寫分別可重入) |
| 可中斷 | ❌ | ✅ (lockInterruptibly) | ✅ |
| 公平性 | ❌ (非公平) | ✅ (可選公平/非公平) | ✅ (可選) |
| 條件隊列 | 1 個 (內置) | 多個 (newCondition) | 多個 (寫鎖擁有) |
| 讀寫分離 | ❌ | ❌ | ✅ (共享鎖/獨占鎖) |
| 性能(低競爭) | 優 (JVM 優化、偏向鎖) | 略低 | 讀多寫少極優 |
state (volatile int):同步狀態,0=未鎖定,>0=鎖定次數(可重入計數)exclusiveOwnerThread:持有獨占鎖的線程head/tail (volatile Node):CLH 變體雙向隊列,節點封裝線程及等待狀態waitStatus:SIGNAL(-1) 需喚醒後繼、CANCELLED(1) 取消、CONDITION(-2) 條件等待lock() → acquire(1))state 從 0 改為 1,成功則設置 exclusiveOwnerThread 返回state++ 直接返回addWaiter(Node.EXCLUSIVE) 構建節點尾插入隊列acquireQueued 循環:前驅為 head 嘗試 CAS 獲取 → 失敗則 shouldParkAfterFailedAcquire 設置前驅 SIGNAL → LockSupport.park() 掛起 → 被喚醒/中斷後重試unlock() → release(1))state--,若歸零清除 exclusiveOwnerThreadstate==0,喚醒 head 後繼節點 (unparkSuccessor)tryAcquire 直接 CAS 搶鎖,新來線程可插隊超越隊列頭tryAcquire 先檢查 hasQueuedPredecessors(),有排隊線程則不搶鎖直接入隊state 32 位劃分:高 16 位 = 共享鎖計數 (讀鎖數,最大 65535),低 16 位 = 獨占鎖計數 (寫鎖重入數)。
static final int SHARED_SHIFT = 16;
static final int SHARED_UNIT = 1 << SHARED_SHIFT; // 0x10000
static final int MAX_COUNT = (1 << SHARED_SHIFT) - 1; // 65535
static final int EXCLUSIVE_MASK = (1 << SHARED_SHIFT) - 1; // 0xFFFF
static int sharedCount(int c) { return c >>> SHARED_SHIFT; }
static int exclusiveCount(int c) { return c & EXCLUSIVE_MASK; }
tryReadLock)HoldCounter)tryWriteLock)state != 0 且 (寫鎖計數==0 或 持有者非當前線程) → 失敗Condition (如 notEmpty/notFull)await()/signal()/signalAll()、可中斷 (awaitUninterruptibly)、超時 (awaitNanos)waitStatus = CONDITION,單獨維護條件隊列,signal 時將節點轉移至同步隊列尾部synchronized (JVM 優化最好、代碼簡潔)ReentrantLockReentrantReadWriteLock 或 StampedLock (JDK 8+ 樂觀讀)LongAdder/AtomicLong (無鎖優於有鎖)Lock 體系以 AQS 為核心,通過 state、CLH 隊列、CAS、LockSupport.park/unpark 實現靈活的同步語義。深入理解 ReentrantLock 入隊/自旋/喚醒流程、ReadWriteLock 狀態壓縮與鎖升降級規則,是攻克高併發性能瓶頸、排查死鎖/活鎖的關鍵能力。