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

Java併發核心:synchronized與Lock鎖機制深度解析

     編輯:Java 相關知識

多線程環境下,鎖是解決共享資源衝突的核心手段。Java提供內置鎖(synchronized)與顯式鎖(Lock介面)兩套機制,理解其差異對編寫高性能併發代碼至關重要。

對象鎖基礎

  • 每個Java對象天然持有一把監視器鎖
  • JVM維護鎖計數器:遞歸加鎖計數+1,退出同步塊計數-1
  • 計數歸零時釋放鎖,喚醒等待線程
  • 只有持鎖線程可重複獲得同一對象鎖(可重入性)

synchronized三種應用模式

1. 同步實例方法

public synchronized void method() { ... }
// 等價於 synchronized(this) { ... }

2. 同步靜態方法

public static synchronized void staticMethod() { ... }
// 鎖定Class對象:synchronized(MyClass.class) { ... }

3. 同步代碼塊(精細控制鎖範圍)

private final Object lock1 = new Object();
private final Object lock2 = new Object();

public void methodA() {
    synchronized(lock1) { /* 訪問資源A */ }
}

public void methodB() {
    synchronized(lock2) { /* 訪問資源B,與A並行 */ }
}

鎖粒度對比實驗

同一把鎖:線程串行執行

單鎖模式:三線程串行進入同步塊

不同鎖:線程並行執行

多鎖模式:三線程並行執行互不阻塞

Lock介面進階特性

private final Lock lock = new ReentrantLock();

public void safeMethod() {
    lock.lock();  // 必須手動加鎖
    try {
        // 臨界區代碼
    } finally {
        lock.unlock();  // 必須在finally中釋放
    }
}

Lock優於synchronized的特性

特性synchronizedLock
可中斷獲取鎖不支持lockInterruptibly()
超時獲取鎖不支持tryLock(timeout)
公平鎖選項非公平new ReentrantLock(true)
多條件變量單一wait/notifynewCondition()多個
鎖狀態檢查無isLocked()/getHoldCount()

最佳實踐建議

  1. 優先使用synchronized:JVM優化成熟(偏向鎖、輕量級鎖、鎖消除),代碼簡潔
  2. 需要高級特性時用Lock:超時控制、公平調度、條件變量分離
  3. 縮小鎖範圍:同步塊優於同步方法,減少臨界區代碼
  4. 避免死鎖:固定獲取鎖順序、使用tryLock超時機制

現代JDK中synchronized性能已大幅優化,除非需要Lock特有功能,否則應優先選擇內置鎖簡化開發。

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