首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 多線程同步進階:synchronized 塊鎖定靜態變量陷阱與 final 修復方案

     編輯:Java 相關知識

synchronized 塊同步類方法

通過類變量作為鎖對象,同步特定靜態/非靜態方法:

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 不可變性導致的同步破壞

String s = "hello";
s = "world";  // 實際創建新對象,hashCode 改變

synchronized 鎖住的是對象實例,而非變量名。修改引用 = 換鎖。

修復方案:final 保護鎖對象

private final static String sync = "";  // 編譯期保證不被重新賦值
  • 定義時賦值,後續不可修改
  • IDE 直接報錯阻止錯誤寫法
  • 徹底杜絕「換鎖」導致的同步失效

雙重理解視角

本質:利用對象鎖的互斥性實現同步。

關鍵限制

synchronized 塊參數必須是對象。
基本類型 (int/char/boolean 等) 不能 作為同步鎖。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
視角理解
方法角度通過類變量鎖定相關方法,同一時間只能執行一個
變量角度保證類變量同一時間只被一個方法訪問 (互斥訪問)