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

Java 同步機制深度解析:synchronized 鎖對象、作用域與最佳實踐

     編輯:Java 相關知識

核心原則

  1. synchronized 鎖永遠是物件,而非程式碼片段或方法。
  2. 每個物件僅關聯一把鎖。
  3. 同步有顯著系統開銷,可能導致死鎖,應盡量避免無謂同步。

三種使用形式與鎖對象

1. 同步實例方法

public synchronized void methodAAA() { ... }

等價於:

public void methodAAA() { synchronized(this) { ... } }

鎖:調用該方法的實例物件 (如 P1)。
含義:同一實例的多執行緒互斥;不同實例 (P2) 互不干擾,可同時進入。

2. 同步區塊

public void method3(SomeObject so) {
    synchronized(so) { ... } // 鎖為 so 物件
}

無明確鎖物件時,可建立專用鎖:

private byte[] lock = new byte[0]; // 零長度 byte[],建立最經濟 (3 位元碼 vs Object 7 位元碼)
synchronized(lock) { ... }

3. 同步靜態方法 / Class 字面常量

public synchronized static void staticMethod() { ... }
// 等價於
synchronized(Foo.class) { ... }

鎖:Class 物件 (Foo.class),而非實例。
注意:P1.getClass() 不等同 Foo.class (繼承時不同),不可用於鎖定類。

關鍵推論

同一類別中,synchronized static 方法與 synchronized 實例方法鎖不同 (Class vs Instance),不會互斥,並發存取共享資料會導致競態條件。

安全共享資料模式

  1. 封裝 + 同步存取器:private 欄位 + synchronized getter/setter,防止外部繞過同步直接修改。
  2. 可變物件防禦性複製:若欄位為可變物件 (陣列、Collection),getter 必須回傳 clone() 或副本,否則外部持有引用可繞過同步修改內部狀態。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved