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

多線程進階:synchronized 同步機制深度解析

     編輯:Java 綜合教學

為什麼需要 synchronized?

多線程並發訪問共享資源(實例變量)時,會出現「非線程安全」問題:數據錯亂、邏輯錯誤。synchronized 充當「監督者」,強制線程排隊訪問同步代碼塊/方法,保證原子性與可見性。

核心結論

  • 非線程安全源頭: 多線程同時訪問同一對象的實例變量。方法局部變量(棧上)天然線程安全。
  • 同步方法鎖對象: 非靜態同步方法鎖 this;靜態同步方法鎖 Class 對象。
  • 同一對象的同步方法互斥: 線程 A 進入 synchronized void foo(),線程 B 嘗試進入同對象的 synchronized void bar() 會阻塞。

代碼演示:非安全 → 安全

非線程安全版

public class HasSelfPrivateNum {
    public void addI(String userName) {
        int num = 0;
        if ("a".equals(userName)) { num = 100; sleep(100); }
        else { num = 200; }
        System.out.println(userName + " num=" + num);
    }
}
// 兩線程共享同一 HasSelfPrivateNum 實例調用 addI,輸出交錯錯亂

加上 synchronized

public synchronized void addI(String userName) { ... }

輸出變為順序:先打印 a 相關,再打印 b 相關,線程安全達到。

同步代碼塊細粒度控制

public void addI(String userName) {
    synchronized (this) { // 或 synchronized (lockObject)
        // 關鍵區域
    }
}

優點:縮小鎖範圍,提高併發度;可指定任意對象作為鎖。

常見誤區

  • 不同實例調用同步方法不互斥(鎖不同 this)。
  • synchronized 不保護非同步方法對共享變量的訪問。
  • 過度同步導致性能下降、死鎖風險。

下一步學習

後續將講解 volatile、Lock 接口、Condition、線程池、併發容器等進階主題。

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