
synchronized 既保證原子性又保證內存可見性,是 JVM 基於 Monitor 實現的鎖機制。JDK 1.6 引入偏向鎖、輕量級鎖、重量級鎖優化,鎖只能單向升級(無鎖 → 偏向 → 輕量級 → 重量級),不支持降級。
// 同步代碼塊:monitorenter / monitorexit
// 同步方法:ACC_SYNCHRONIZED 標志
public void methodA() {
// 反編譯關鍵指令:
// 3: monitorenter ← 獲取鎖
// ... 方法體
// 13: monitorexit ← 釋放鎖(正常退出)
// 19: monitorexit ← 釋放鎖(異常退出)
}
異常表確保異常路徑也能釋放鎖,防止死鎖。
| 鎖類型 | 適用場景 | 實現原理 | 優缺點 |
|---|---|---|---|
| 偏向鎖 | 無競爭、同一線程反復獲取 | CAS 設置 Mark Word 線程 ID,後續進出無 CAS | 極低開銷;競爭時需撤銷(全局安全點) |
| 輕量級鎖 | 低競爭、短暫持有 | CAS 將 Mark Word 指向棧帧 Lock Record,自旋等待 | 避免阻塞喚醒;自旋消耗 CPU,失敗膨脹為重量級 |
| 重量級鎖 | 高競爭、長時間持有 | OS Mutex,線程掛起/喚醒 | 公平調度;上下文切換開銷大 |


-XX:BiasedLockingStartupDelay=0:啟動即啟用偏向鎖(默認 4s 延遲)-XX:-UseBiasedLocking:禁用偏向鎖-XX:PreBlockSpin:自旋次數(JDK 1.7+ 自適應)synchronized 經過多版本演進已非「重鎖」刻板印象。理解鎖升級、Mark Word、自旋優化,能指導鎖粒度設計、減少競爭、排查性能瓶頸。實戰中:縮小同步塊、避免長時間持有鎖、善用併發容器替代顯式鎖。