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

Java 多線程核心:synchronized 鎖機制原理與實戰模式

     編輯:Java 相關知識

前言

synchronized 是 Java 並發編程的基石關鍵字,理解其鎖對象、作用域、可重入特性,是編寫正確高效併發代碼的前提。本文通過漸進式案例深度剖析。

基礎場景:無同步時的並發交替

public class SynDemo {
    public void synMethod1() {
        while (true) { sleep(1000); System.out.println("synMethod1"); }
    }
    public void synMethod2() {
        while (true) { sleep(1000); System.out.println("synMethod2"); }
    }
}

// 主程序啟動兩線程分別調用 synMethod1/2
// 輸出:交替打印 synMethod1、synMethod2、main...

兩線程並發無阻塞,CPU 時間片輪轉交替執行。

給實例方法加 synchronized:鎖住 this 實例

public synchronized void synMethod1() { ... }
public synchronized void synMethod2() { ... }

現象:只有 synMethod1 執行,synMethod2 永不執行。

原因:實例方法 synchronized 鎖的是 this (當前實例)。synMethod1 的 while(true) 永不退出,持有鎖不釋放,導致 synMethod2 無法獲取鎖而永久阻塞。

等價寫法:

public void synMethod1() {
    synchronized (this) { while(true) { ... } }
}

進階模式:使用獨立鎖對象實現細粒度同步

public class SynDemo {
    private final Object lock1 = new Object();
    private final Object lock2 = new Object();

    public void synMethod1() {
        synchronized (lock1) { while(true) { sleep(1000); System.out.println("synMethod1"); } }
    }
    public void synMethod2() {
        synchronized (lock2) { while(true) { sleep(1000); System.out.println("synMethod2"); } }
    }
}

效果:兩線程各自持有不同鎖,並發執行互不干擾,輸出交替出現 synMethod1、synMethod2。

核心知識點總結

維度說明
鎖對象實例方法鎖 this;靜態方法鎖 Class 對象;代碼塊鎖指定對象
可重入性同一線程可重複獲取同一鎖 (計數器機制)
內存可見性解鎖前將工作內存刷新到主內存,獲取鎖後從主內存讀取,保證可见性
性能考量JDK 6+ 引入偏向鎖、輕量級鎖、鎖消除、鎖粗化等優化,性能大幅提升

最佳實踐建議

  1. 縮小鎖範圍:僅同步必要代碼塊,避免在同步塊中調用耗時操作 (IO、睡眠、外部服務)。
  2. 使用私有 final 鎖對象:private final Object lock = new Object(); 防止外部代碼獲取同一鎖造成死鎖或活鎖。
  3. 考慮 ReentrantLock:需公平鎖、可中斷、超時獲取、多條件變量等高級特性時優先選擇 java.util.concurrent.locks.ReentrantLock。
  4. 避免死鎖:固定鎖獲取順序、使用 tryLock(timeout)、減少嵌套鎖。

延伸主題

  • static synchronized 與類鎖機制
  • 繼承中 synchronized 方法的覆寫與鎖對象關係
  • volatile 與 synchronized 協同:可見性 vs 原子性
  • JVM 鎖優化演進:偏向鎖 → 輕量級鎖 → 重量級鎖

以上主題網上資源豐富,建議系統學習《Java 並發編程實戰》深入掌握。

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