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

Java 多線程同步核心:synchronized 塊同步非靜態/靜態方法、內部類與 Class 鎖機制

     編輯:Java 相關知識

synchronized 兩種用法

  1. 方法修飾符:public synchronized void method()
  2. synchronized 塊:synchronized(表達式) { ... } — 更靈活、可見性更強

一、非靜態方法同步:this 鎖

public void method1() {
    synchronized(this) { ... }  // 等價於方法加 synchronized
}
public void method2() {
    synchronized(this) { ... }
}
public synchronized void method3() { ... }

效果:同一實例下,method1/2/3 同一時間僅一個可執行。

注意:所有代碼必須在塊內,否則無法全方法同步。

別名:SyncBlock.this 等價於 this。

內部類非靜態方法同步外部類

class InnerClass {
    public void method4() {
        synchronized(SyncBlock.this) { ... }  // 鎖外部類實例
    }
}

內部類 this 鎖內部實例,OuterClass.this 鎖外部實例,實現跨類同步。

鎖自動釋放保證

synchronized 塊正常結束或異常拋出均自動釋放鎖,無需手動管理。

二、靜態方法同步:Class 對象鎖

靜態方法調用不需要實例,不能用 this,必須用 Class 對象:

public static void method1() {
    synchronized(StaticSyncBlock.class) { ... }  // 類字面量獲取 Class
}
public static synchronized void method2() { ... }

效果:method1/2 同一時間僅一個可執行 (類級別鎖)。

獲取 Class 對象的多種方式

  • 類名.class (最常用、編譯期常量)
  • 實例.getClass() (運行時獲取,同類所有實例返回同一 Class)

跨類靜態方法同步

// Test 類靜態方法與 StaticSyncBlock 類靜態方法同步
public static void method() {
    synchronized(StaticSyncBlock.class) { ... }  // 共享同一 Class 鎖
}

關鍵規則總結

方法類型可用鎖說明
非靜態this / 外部類.this / 任意共享對象實例級鎖
靜態類名.class / 實例.getClass()類級鎖
非靜態中同步靜態類名.class可行
靜態中同步非靜態this不可行 (無 this)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved