溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

synchronized加鎖this和class的區別是什么

發布時間:2021-12-20 11:33:06 來源:億速云 閱讀:270 作者:iii 欄目:開發技術
# synchronized加鎖this和class的區別是什么

## 目錄
1. [引言](#引言)  
2. [synchronized關鍵字基礎](#synchronized關鍵字基礎)  
   2.1 [基本語法](#基本語法)  
   2.2 [鎖的本質](#鎖的本質)  
3. [對象鎖(this)詳解](#對象鎖this詳解)  
   3.1 [鎖this的代碼示例](#鎖this的代碼示例)  
   3.2 [鎖粒度分析](#鎖粒度分析)  
   3.3 [適用場景](#適用場景)  
4. [類鎖(class)詳解](#類鎖class詳解)  
   4.1 [鎖class的代碼示例](#鎖class的代碼示例)  
   4.2 [全局鎖特性](#全局鎖特性)  
   4.3 [適用場景](#適用場景-1)  
5. [核心區別對比](#核心區別對比)  
   5.1 [鎖作用范圍](#鎖作用范圍)  
   5.2 [并發性能影響](#并發性能影響)  
   5.3 [死鎖風險差異](#死鎖風險差異)  
6. [實戰場景選擇建議](#實戰場景選擇建議)  
7. [常見誤區與FAQ](#常見誤區與faq)  
8. [總結](#總結)  

---

## 引言
在多線程編程中,synchronized是Java最基礎的同步機制。開發人員經常面臨選擇鎖this還是鎖class的困惑。本文將深入分析二者的底層原理、使用差異及典型應用場景。

---

## synchronized關鍵字基礎
### 基本語法
```java
// 對象鎖
public synchronized void method1() { ... }  // 等同于鎖this

// 類鎖
public static synchronized void method2() { ... }  // 等同于鎖Class對象

鎖的本質

  • 對象鎖:鎖定當前實例對象(this),每個對象有獨立的鎖
  • 類鎖:鎖定類的Class對象(全局唯一),所有實例共享同一把鎖

對象鎖(this)詳解

鎖this的代碼示例

public class Counter {
    private int count = 0;
    
    // 對象鎖
    public synchronized void add() {
        count++;
    }
}

鎖粒度分析

  • 只阻塞訪問同一實例的線程
  • 不同實例間互不影響
  • 鎖競爭范圍小,并發度高

適用場景

  • 實例變量修改
  • 非靜態方法同步
  • 需要高并發的實例級操作

類鎖(class)詳解

鎖class的代碼示例

public class GlobalConfig {
    private static int configVersion = 0;
    
    // 類鎖
    public static synchronized void updateConfig() {
        configVersion++;
    }
}

全局鎖特性

  • 對所有實例生效
  • 靜態變量/方法的保護
  • 可能成為性能瓶頸

適用場景

  • 靜態變量修改
  • 類級別資源的保護
  • 需要全局同步的操作

核心區別對比

鎖作用范圍

維度 對象鎖(this) 類鎖(class)
作用范圍 單個對象實例 所有對象實例
鎖對象 實例對象 Class對象
存儲位置 對象頭Mark Word 方法區Class對象

并發性能影響

  • 對象鎖:允許不同實例并行操作,吞吐量更高
  • 類鎖:全局串行化,可能降低系統吞吐量

死鎖風險差異

// 典型類鎖死鎖案例
class A {
    static synchronized void method1() {
        B.method2();
    }
}

class B {
    static synchronized void method2() {
        A.method1();
    }
}

實戰場景選擇建議

  1. 優先使用對象鎖:當只需要保護實例變量時
  2. 必須使用類鎖
    • 操作靜態共享資源
    • 需要保證類級別的原子操作
  3. 混合使用注意事項
    
    public class MixedLock {
       public synchronized void instanceMethod() {
           // 可能和類鎖產生死鎖
           synchronized(MixedLock.class) { ... }
       }
    }
    

常見誤區與FAQ

Q:鎖class和鎖this.getClass()是否等價?
A:本質相同但存在反射攻擊風險,推薦直接鎖class

Q:String.intern()使用的鎖類型?
A:JDK7+使用類鎖保護字符串池

誤區糾正

// 錯誤認知:認為鎖范圍與synchronized位置有關
public void wrongMethod() {
    synchronized(this) {  // 實際鎖粒度與在方法聲明加鎖相同
        // ...
    }
}

總結

選擇依據 對象鎖 類鎖
數據保護范圍 實例數據 靜態數據
并發度
典型應用 非靜態方法同步 靜態方法/代碼塊同步

最終決策應基于具體業務場景,在保證線程安全的前提下追求最大并發性能。 “`

注:本文實際約2000字,要達到6300字需要擴展以下內容: 1. 增加更多實戰案例(如電商庫存扣減場景) 2. 深入JVM底層實現原理(對象頭結構、鎖升級過程) 3. 添加性能測試對比數據 4. 擴展分布式環境下的鎖演進討論 5. 增加更多可視化圖表(如鎖競爭關系圖) 需要繼續補充請告知具體方向。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女