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

Java 多線程同步入門:synchronized 關鍵字修飾方法、單例模式線程安全與性能陷阱

     編輯:Java 相關知識

synchronized 修飾方法基本用法

public synchronized void run() { ... }  // 實例方法同步
public static synchronized void method() { ... }  // 靜態方法同步

效果:同一實例下,所有 synchronized 實例方法互斥;同一類下,所有 synchronized 靜態方法互斥。

實例鎖綁定陷阱

Test test1 = new Test();
Test test2 = new Test();
// test1.method() 和 test2.method() 可同時執行!鎖的是不同實例
// 必須共享同一實例才能實現同步

單例模式線程不安全演示

class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            Thread.yield();  // 放大並發問題
            instance = new Singleton();
        }
        return instance;
    }
}
// 5線程並發調用 → 可能創建多個實例 (輸出不同 hashCode)

兩種線程安全修復方案

  1. 同步方法:public static synchronized Singleton getInstance()
  2. 饿漢模式:private static final Singleton instance = new Singleton(); (類加載時創建,天然線程安全)

synchronized 四大注意事項

規則說明
不可繼承子類覆寫父類 synchronized 方法默認不同步,需顯式加 synchronized 或調用 super.method()
接口方法不可用interface 中方法聲明不能加 synchronized
構造方法不可用但可在構造器內用 synchronized 塊
位置靈活public synchronized / synchronized public / public static synchronized / synchronized public static 合法;public void synchronized 非法

性能陷阱:粗粒度鎖 = 表鎖效應

public synchronized void method1() { while(true); }
public synchronized void method2() { ... }
public static synchronized void method3() { while(true); }
public static synchronized void method4() { ... }

運行結果:method1 執行時 method2 阻塞;method3 執行時 method4 阻塞。
結論:同一類別中,所有 synchronized 實例方法共享一把鎖,所有 synchronized 靜態方法共享另一把鎖。
類比:修改一行數據卻鎖整張表 —— 大量使用導致性能劇降。

最佳實踐

  • 縮小同步範圍:優先用 synchronized 塊鎖定關鍵代碼段
  • 避免在同步方法中調用耗時操作 (IO/睡眠/長計算)
  • 高併發場景考慮 ReentrantLock、ConcurrentHashMap 等精細化工具
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved