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

Java synchronized 關鍵字深度解析與實戰規則

     編輯:Java 相關知識

核心作用

synchronized 保證同一時間只有一個線程執行被修飾的方法或代碼塊,實現線程安全。

五大核心規則

  1. 同一對象的同步代碼塊互斥:兩線程訪問同一對象的 synchronized(this) 塊,同一時刻僅一線程執行。
  2. 非同步代碼塊不受影響:一線程進入同步塊時,另一線程仍可訪問該對象的非同步方法。
  3. 同一對象的所有同步塊互斥:一線程持有對象鎖,其他線程訪問該對象任意 synchronized(this) 塊均阻塞。
  4. 同步方法等同於鎖定整個方法:synchronized method 相當於 synchronized(this){...} 包裹全方法體。
  5. 規則對其他對象鎖同樣適用:鎖住 inner 對象則阻塞該對象的所有同步區域。

代碼驗證示例

規則 1:同步塊串行執行

public class Thread1 implements Runnable {
    public void run() {
        synchronized(this) {
            for (int i=0; i<5; i++) 
                System.out.println(Thread.currentThread().getName() + " loop " + i);
        }
    }
    public static void main(String[] args) {
        Thread1 t1 = new Thread1();
        new Thread(t1, "A").start();
        new Thread(t1, "B").start();
    }
}
// 輸出:A 0-4 後 B 0-4,串行

規則 2:非同步方法可並發

public void m4t1() { synchronized(this){ ... } }
public void m4t2() { ... } // 無 synchronized
// t1 執行 m4t1,t2 執行 m4t2 → 交替輸出,並發

規則 3:同步方法互斥

public synchronized void m4t1() { ... }
public synchronized void m4t2() { ... }
// 即使調用不同方法,同一對象下也串行

規則 4:靜態同步方法鎖 Class 對象

public static synchronized void staticSync() { ... }
// 不同實例調用仍串行,鎖是 Class 對象

規則 5:指定任意對象鎖

synchronized(inner) { inner.m4t1(); } // 鎖 inner
inner.m4t2(); // 非同步,可並發
// 若 m4t2 加 synchronized,則也被阻塞

同步方法 vs 同步塊

維度同步方法同步塊
粒度粗粒度(整方法)細粒度(指定代碼段)
鎖對象隱式 this / Class顯式指定任意對象
靈活性低高
性能較差(鎖範圍大)較好(縮小臨界區)

最佳實踐

  • 優先使用同步塊,縮小鎖範圍。
  • 避免在長時間運行的方法(如 run())上加 synchronized。
  • 使用私有 final 對象作為鎖,防止外部干擾:private final Object lock = new Object();

總結

理解 synchronized 的鎖機制、對象鎖與類鎖區別、同步塊優勢,是編寫高併發安全代碼的基礎。

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