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

Java synchronized 區塊同步非靜態/靜態方法與變數完整指南

     編輯:Java 相關知識

synchronized 兩種用法

  1. 同步方法:public synchronized void method()
  2. 同步區塊:synchronized(表達式) { ... } —— 更靈活,可指定鎖物件。

一、同步非靜態方法(實例鎖)


public class SyncBlock {
    public void method1() {
        synchronized(this) { ... } // 等同於方法加 synchronized
    }
    public void method2() {
        synchronized(this) { ... }
    }
    public synchronized void method3() { ... } // 寫法二
}
  • 同一實例下,method1/2/3 任一時刻只能有一個執行。
  • 內部類若要與外部類共用鎖:synchronized(OuterClass.this)。

二、同步靜態方法(類鎖)


public class StaticSyncBlock {
    public static void method1() {
        synchronized(StaticSyncBlock.class) { ... } // 必須用 Class 物件
    }
    public static synchronized void method2() { ... } // 寫法二
}
  • 靜態方法無 this,鎖為 Class 物件(.class 或 instance.getClass())。
  • 不同類別的靜態方法可共用同一把 Class 鎖實現跨類同步。

三、同步區塊自動釋放鎖

無論正常結束或拋出異常,JVM 保證離開區塊時釋放監視器鎖,無需手動 unlock。

四、同步變數(以字串為例)


private static String lock = "";
synchronized(lock) { ... } // 危險!
lock = "new"; // 重新賦值導致鎖物件改變,同步失效

解決:宣告 private final static String LOCK = "";,防止誤改鎖物件參考。

五、注意事項速查表

場景鎖表達式備註
實例方法互斥this 或 Outer.this預設行為
靜態方法互斥MyClass.class不可用 this
跨類別靜態方法互斥SharedClass.class共用同一 Class 物件
同步區塊內拋異常自動釋放無需 finally
基本型別鎖❌ 不可需包裝類或專用物件

最佳實務

  1. 鎖物件宣告 final,避免參考被竄改。
  2. 盡量縮小同步區塊範圍,減少鎖爭用。
  3. 靜態/非靜態鎖互不干擾,按需組合。
  4. 高併發場景考慮 ReentrantLock 或 StampedLock 替代。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved