通過類變量作為鎖對象,同步特定靜態/非靜態方法:
private static String sync = "";
private static void method(String s) {
synchronized (sync) { // 以 sync 為鎖
sync = s; // ⚠️ 致命錯誤:修改鎖對象引用!
System.out.println(s);
while (true); // 永久佔用鎖
}
}
method1
staticMethod1
原因:sync = s 創建了新 String 對象,導致兩線程鎖住不同對象,同步失效。
String s = "hello";
s = "world"; // 實際創建新對象,hashCode 改變
synchronized 鎖住的是對象實例,而非變量名。修改引用 = 換鎖。
private final static String sync = ""; // 編譯期保證不被重新賦值
| 視角 | 理解 |
|---|---|
| 方法角度 | 通過類變量鎖定相關方法,同一時間只能執行一個 |
| 變量角度 | 保證類變量同一時間只被一個方法訪問 (互斥訪問) |