synchronized 是 Java 關鍵字,用於保證同一時刻最多只有一個線程執行某段代碼,實現互斥同步。它提供了隱式的鎖機制,由 JVM 自動獲取和釋放。
public synchronized void instanceMethod() {
// 同一時刻僅一個線程能進入當前對象的所有同步實例方法
}
this (當前實例)public static synchronized void staticMethod() {
// 同一時刻僅一個線程能進入該類的所有同步靜態方法
}
CurrentClass.class (Class 對象)public void method() {
// 非同步代碼...
synchronized (this) {
// 同步代碼 - 鎖住當前對象
}
// 非同步代碼...
}
thispublic class FineGrainedLock {
private final Object lockA = new Object();
private final Object lockB = new Object();
private Resource resourceA, resourceB;
public void operateA() {
synchronized (lockA) { // 僅鎖資源 A
// 訪問 resourceA
}
}
public void operateB() {
synchronized (lockB) { // 僅鎖資源 B
// 訪問 resourceB
}
}
public void operateBoth() {
synchronized (lockA) {
synchronized (lockB) { // 雙重鎖,注意死鎖風險
// 同時訪問 A 和 B
}
}
}
}
new byte[0] 比 new Object() 更節省內存 (3 vs 7 字節碼)| 用法 | 鎖對象 | 作用範圍 |
|---|---|---|
| 同步實例方法 | this | 當前實例所有同步實例方法 |
| 同步靜態方法 | ClassName.class | 該類所有同步靜態方法 |
| synchronized(this) | this | 代碼塊內容 |
| synchronized(customObj) | customObj | 代碼塊內容 |
| synchronized(ClassName.class) | ClassName.class | 代碼塊內容 |
ReentrantLocksynchronized 修飾方法等價於 synchronized(this) { 方法體 },但字節碼標識不同 (ACC_SYNCHRONIZED vs monitorenter/monitorexit)String 常量池導致的意外共享鎖:synchronized("lock") 可能鎖住全局同一字符串深入理解 synchronized 的四種用法、鎖對象本質及 JVM 優化機制,是寫出高性能、無死鎖併發代碼的關鍵。