Java 5.0 前僅有 synchronized(內置鎖)和 volatile。JDK 5.0 引入 java.util.concurrent.locks.Lock 接口及其核心實現 ReentrantLock,提供更精細的鎖控制能力。
public interface Lock {
void lock(); // 阻塞獲取鎖
void lockInterruptibly() throws InterruptedException; // 可中斷獲取
boolean tryLock(); // 非阻塞嘗試獲取
boolean tryLock(long time, TimeUnit unit) throws InterruptedException; // 超時獲取
void unlock(); // 釋放鎖
Condition newCondition(); // 關聯條件變量
}
| 特性 | 說明 | 對應方法 |
|---|---|---|
| 可重入 | 同一線程可多次獲取鎖,需同次數釋放 | 內部實現 |
| 公平/非公平 | 構造函數 new ReentrantLock(true) 選擇公平鎖(FIFO),預設非公平(吞吐率高) | 構造函數 |
| 輪詢獲取 | 嘗試獲取鎖,失敗立即返回,避免死鎖 | tryLock() |
| 定時獲取 | 在指定時間內嘗試獲取,超時返回 | tryLock(time, unit) |
| 可中斷 | 獲取鎖過程中可響應中斷,拋出 InterruptedException | lockInterruptibly() |
| 條件變量 | 一個鎖可關聯多個 Condition,實現精細線程協作 | newCondition() |
Lock lock = new ReentrantLock();
lock.lock();
try {
// 臨界區操作
} finally {
lock.unlock(); // 必須在 finally 中釋放,防止死鎖
}
針對「讀多寫少」場景優化:允許多線程並發讀,寫操作獨佔。
public interface ReadWriteLock {
Lock readLock(); // 共享鎖
Lock writeLock(); // 排他鎖
}
ReentrantLock。
public class ReadWriteMap<K, V> {
private final Map<K, V> map = new HashMap<>();
private final ReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock r = lock.readLock();
private final Lock w = lock.writeLock();
public V get(K key) {
r.lock();
try { return map.get(key); }
finally { r.unlock(); }
}
public void put(K key, V value) {
w.lock();
try { map.put(key, value); }
finally { w.unlock(); }
}
}
Condition 實現有界隊列的生產消費模型。tryLock(timeout) 替代無限等待,超時後釋放已持有鎖並重試。synchronized(JVM 優化後性能優異、代碼簡潔),僅在需要 Lock 進階特性時使用 ReentrantLock。lock() -> try -> finally unlock() 模式。ReentrantReadWriteLock,注意寫鎖降級規則。tryLock() 實現無鎖重試邏輯,避免死鎖。