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

Java 線程安全核心:Lock 接口深度解析與實戰模式

     編輯:Java 綜合教學

Java 線程安全核心:Lock 接口深度解析與實戰模式

java.util.concurrent.locks.Lock 是 JDK 1.5 引入的顯式鎖機制,提供比 synchronized 更豐富的並發控制能力(可中斷、超時、公平鎖、條件變量)。本文對比兩者差異,詳解核心 API 並給出生產級使用模式。

Lock vs synchronized 核心差異

維度synchronizedLock
本質JVM 內置關鍵字Java 類庫 API (interface)
釋放方式自動 (塊結束/異常)手動 unlock() (必須在 finally 中)
可中斷不可中斷lockInterruptibly() 支持中斷
超時獲取不支持tryLock(timeout) 支持
公平鎖非公平 (JVM 優化後)ReentrantLock(true) 可選公平
條件變量wait/notifynewCondition() 多條件隊列

核心 API 速查

void lock();                          // 獲取鎖,阻塞直到成功
void lockInterruptibly() throws InterruptedException;  // 可中斷獲取鎖
boolean tryLock();                    // 非阻塞嘗試獲取,立即返回
boolean tryLock(long time, TimeUnit unit); // 超時嘗試獲取
void unlock();                        // 釋放鎖
Condition newCondition();             // 創建條件變量

生產級使用模式:標準鎖框架

private final ReentrantLock lock = new ReentrantLock();

public void safeOperation() {
    lock.lock();  // 1. 獲取鎖
    try {
        // 2. 臨界區業務邏輯
        System.out.println(Thread.currentThread().getName() + " 處理業務");
    } catch (Exception e) {
        // 3. 異常處理
    } finally {
        // 4. 必須釋放鎖,防止死鎖
        lock.unlock();
    }
}

鐵律:lock() 與 unlock() 必須配對,且 unlock() 放在 finally 中。

進階特性實戰

1. 可重入特性驗證

lock.lock();
lock.lock(); lock.lock();  // 同一線程可重複獲取
try { /* 業務 */ }
finally {
    lock.unlock(); lock.unlock(); lock.unlock();  // 必須對應釋放相同次數
}

2. 超時獲取避免無限等待

if (lock.tryLock(1, TimeUnit.SECONDS)) {
    try { /* 業務 */ }
    finally { if (lock.isHeldByCurrentThread()) lock.unlock(); }
} else {
    // 超時處理:降級、重試、拋棄、告警
    log.warn("獲取鎖超時,放棄本次操作");
}

適用於分布式鎖降級、高併發熱點資源保護等場景。

3. 條件變量實現精準通知

private final Condition notFull = lock.newCondition();
private final Condition notEmpty = lock.newCondition();

// 生產者
lock.lock();
try {
    while (queue.size() == capacity) notFull.await();
    queue.add(item);
    notEmpty.signal();
} finally { lock.unlock(); }

// 消費者
lock.lock();
try {
    while (queue.isEmpty()) notEmpty.await();
    Item item = queue.poll();
    notFull.signal();
    return item;
} finally { lock.unlock(); }

相比 wait/notify,Condition 支持多條件隊列,實現「生產者只喚醒消費者、消費者只喚醒生產者」的精準控制。

JDK 1.6+ synchronized 優化後的選型建議

  • ✅ 簡單同步、鎖粒度粗、無特殊需求 → synchronized (偏向鎖、輕量級鎖、自適應自旋性能優異)
  • ✅ 需可中斷、超時、公平鎖、多條件變量、非塊結構鎖 → Lock
  • ✅ 高併發讀多寫少 → ReentrantReadWriteLock
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved