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

Java 多線程同步機制詳解:synchronized 關鍵字六大用法與實戰

     編輯:Java 綜合教學

Java 多線程同步機制詳解:synchronized 關鍵字六大用法與實戰

synchronized 是 Java 並發編程的基石,通過監視器鎖實現線程互斥。本文系統梳理其四種鎖形式與兩種同步塊用法,並附帶經典計數器實戰案例。

核心原理:監視器鎖

同步塊鎖定特定對象(監視器),同一時刻僅允許一個線程持有該鎖進入同步代碼區,其他線程阻塞等待。

四種同步方法形式

形式代碼示例鎖對象作用範圍
實例方法同步public synchronized void add()當前實例 (this)同一實例的所有同步實例方法互斥
靜態方法同步public static synchronized void add()類對象 (MyClass.class)同一類的所有同步靜態方法互斥
實例方法同步塊synchronized(this) { ... }指定實例 (通常是 this)細粒度控制,僅同步關鍵代碼段
靜態方法同步塊synchronized(MyClass.class) { ... }指定類對象靜態上下文細粒度同步

關鍵區別與最佳實踐

  • 同步塊優於同步方法:縮小鎖範圍,提高並發度
  • 鎖對象選擇:實例方法用 this,靜態方法用 ClassName.class,也可用私有 final Object lock = new Object() 封裝鎖
  • 避免鎖字符串/基本類型包裝類:常量池導致意外共享鎖

實戰案例:線程安全計數器

public class Counter {
    private long count = 0;
    
    // 同步實例方法,鎖住當前 Counter 實例
    public synchronized void add(long value) {
        this.count += value;
    }
}

public class CounterThread extends Thread {
    private Counter counter;
    
    public CounterThread(Counter counter) { this.counter = counter; }
    
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) counter.add(i);
    }
}

// 測試:共享同一實例 → 線程串行執行 add()
Counter counter = new Counter();
new CounterThread(counter).start();
new CounterThread(counter).start();

// 對比:不同實例 → 線程並行執行,無阻塞
Counter counterA = new Counter(), counterB = new Counter();
new CounterThread(counterA).start();
new CounterThread(counterB).start();

深度思考

  1. 可重入性:同一線程可重複獲取同一鎖(如同步方法調用同步方法)
  2. 內存可見性:解鎖前將工作內存刷新到主內存,加鎖後從主內存讀取
  3. 性能優化:JDK 1.6+ 引入偏向鎖、輕量級鎖、鎖消除、鎖粗化等優化

掌握 synchronized 的鎖對象語義與作用範圍,是編寫正確、高效並發程序的前提。實戰中建議優先使用同步塊配合私有鎖對象,實現最小化同步粒度。

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