synchronized 是 Java 並發編程的基石關鍵字,提供互斥同步機制,確保多執行緒環境下共享資料的一致性與可見性。本文系統整理其鎖對象、鎖範圍、進階用法與效能考量。
| 方式 | 語法範例 | 鎖對象 | 適用場景 |
|---|---|---|---|
| 同步實例方法 | public synchronized void method() | 當前實例 this | 保護實例級共享資源 |
| 同步程式碼區塊 | synchronized(this) { ... } | 指定對象(通常 this) | 縮小鎖範圍,提升並發度 |
| 同步靜態方法 | public static synchronized void method() | 類對象 ClassName.class | 保護類級靜態共享資源 |
| 同步靜態區塊 | synchronized(ClassName.class) { ... } | 類對象 ClassName.class | 靜態資源精細控制 |
BLOCKED 狀態等待。String、Integer 等,因常量池可能導致非預期共享鎖。private final Object lock = new Object();
public void safeMethod() { synchronized(lock) { ... } }
防止外部代碼獲取同一把鎖造成死鎖或活鎖。
this,靜態方法鎖 .class,兩者互不干擾。JDK 1.6+ 引入偏向鎖、輕量級鎖、鎖消除、鎖粗化等優化,大幅降低 synchronized 開銷。高併發場景可考慮 ReentrantLock(公平鎖、可中斷、條件變數)或無鎖資料結構(ConcurrentHashMap、AtomicInteger)。
深入掌握 synchronized 鎖機制,是寫出正確、高效並發程式的關鍵基石。