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

Java 多線程同步:synchronized 方法與塊的區別實戰

     編輯:Java 相關知識

四個對比實驗

實驗 1:有無 synchronized 的差異

// 加 synchronized:串行輸出 0-4 兩次
// 無 synchronized:交替輸出 0,0,1,1... 並發執行

實驗 2:同一對象的多個同步方法

public synchronized void excute() { ... }
public synchronized void excute1() { ... }
// 即使調用不同方法,線程也串行,因為鎖的是同一對象

結論:對象鎖導致該對象所有同步方法互斥。

實驗 3:靜態同步方法

public static synchronized void excute() { ... }
public static synchronized void excute1() { ... }
// 不同實例調用仍串行,鎖是 Class 對象

結論:靜態同步方法鎖定 Class 對象,跨實例生效。

實驗 4:同步塊

public void excute() {
    synchronized(this) { ... } // 同步塊
}
public void excute1() {
    synchronized(this) { ... }
}
// 效果等同於同步方法,但粒度可控

核心區別總結

特性同步方法同步塊
鎖對象隱式 this / Class顯式指定任意對象
鎖範圍整個方法體僅塊內代碼
靈活性低高(可縮小臨界區)
性能較差較好

最佳實踐建議

  1. 優先使用同步塊,將非共享代碼移出同步區。
  2. 使用私有 final 鎖對象:private final Object lock = new Object();
  3. 避免使用字符串常量作為鎖(常量池可能導致意外共享)。
  4. 靜態同步方法僅用於類級別共享狀態。

總結

同步方法是粗粒度並發控制,同步塊提供細粒度控制。合理選擇可顯著提升併發性能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved