interrupt()。public interface Lock {
void lock(); // 阻塞獲取
void lockInterruptibly() throws InterruptedException; // 可中斷獲取
boolean tryLock(); // 非阻塞嘗試
boolean tryLock(long time, TimeUnit unit) throws InterruptedException; // 超時嘗試
void unlock(); // 釋放鎖
Condition newCondition(); // 條件變量
}
實現 Lock,語義與 synchronized 相似但功能更強。支援公平/非公平模式(構造函數 new ReentrantLock(true))。
Lock lock = new ReentrantLock();
public void safeMethod() {
lock.lock();
try {
// 臨界區操作
} finally {
lock.unlock(); // 必須在 finally 中釋放
}
}
定義 readLock() 與 writeLock(),允許「讀讀共存、讀寫互斥、寫寫互斥」,大幅提升讀多寫少場景性能。
new ReentrantReadWriteLock(true) 啟用公平模式。lockInterruptibly()。
class CacheDemo {
private final Map<String, Object> map = new HashMap<>();
private final ReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();
public Object getValue(String key) {
r.lock();
try {
Object value = map.get(key);
if (value == null) {
r.unlock(); // 釋放讀鎖
w.lock(); // 獲取寫鎖
try {
if (value == null) { // 雙重檢查
value = loadFromDB(key);
map.put(key, value);
}
} finally {
r.lock(); // 降級:先獲取讀鎖
w.unlock(); // 再釋放寫鎖
}
}
return value;
} finally {
r.unlock();
}
}
}
| 維度 | synchronized | Lock |
|---|---|---|
| 實現層級 | JVM 關鍵字 | API 接口 |
| 異常釋放 | 自動 | 手動(finally) |
| 可中斷 | 否 | 是 |
| 超時獲取 | 否 | 是 |
| 公平鎖 | 否(非公平) | 可選 |
| 條件變量 | Object.wait/notify | Condition(多條件) |
| 讀寫分離 | 無 | ReadWriteLock |
| 性能(高競爭) | 較差 | 優秀 |
synchronized、ReentrantLock)。Lock.lockInterruptibly() 允許等待線程放棄等待處理其他任務。ReentrantLock(true))。ReadWriteLock)。synchronized(JVM 優化好、代碼簡潔)。Lock。ReadWriteLock 顯著提升性能。StampedLock(樂觀讀)或無鎖數據結構(ConcurrentHashMap、LongAdder)。finally 塊,防止異常導致死鎖。