多線程環境下,鎖是解決共享資源衝突的核心手段。Java提供內置鎖(synchronized)與顯式鎖(Lock介面)兩套機制,理解其差異對編寫高性能併發代碼至關重要。
public synchronized void method() { ... }
// 等價於 synchronized(this) { ... }
public static synchronized void staticMethod() { ... }
// 鎖定Class對象:synchronized(MyClass.class) { ... }
private final Object lock1 = new Object();
private final Object lock2 = new Object();
public void methodA() {
synchronized(lock1) { /* 訪問資源A */ }
}
public void methodB() {
synchronized(lock2) { /* 訪問資源B,與A並行 */ }
}
單鎖模式:三線程串行進入同步塊
多鎖模式:三線程並行執行互不阻塞
private final Lock lock = new ReentrantLock();
public void safeMethod() {
lock.lock(); // 必須手動加鎖
try {
// 臨界區代碼
} finally {
lock.unlock(); // 必須在finally中釋放
}
}
| 特性 | synchronized | Lock |
|---|---|---|
| 可中斷獲取鎖 | 不支持 | lockInterruptibly() |
| 超時獲取鎖 | 不支持 | tryLock(timeout) |
| 公平鎖選項 | 非公平 | new ReentrantLock(true) |
| 多條件變量 | 單一wait/notify | newCondition()多個 |
| 鎖狀態檢查 | 無 | isLocked()/getHoldCount() |
現代JDK中synchronized性能已大幅優化,除非需要Lock特有功能,否則應優先選擇內置鎖簡化開發。