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

Java 多線程進階:Lock、Condition 與 ReadWriteLock 核心機制實戰

     編輯:Java 相關知識

Lock 接口:比 synchronized 更強大的同步工具

Lock lock = new ReentrantLock();
lock.lock();
try {
    // 臨界區
} finally {
    lock.unlock(); // 必須在 finally 釋放,防異常洩漏
}

優勢:可中斷鎖、公平/非公平選擇、嘗試獲取、超時獲取、多條件變數。

ReentrantLock 進階功能

方法用途
lockInterruptibly()可中斷獲取鎖,線程被 interrupt 即拋 InterruptedException
tryLock()非阻塞嘗試,立即返回成功/失敗
tryLock(time, unit)限時嘗試獲取
isFair()查詢是否公平鎖(建構式 `new ReentrantLock(true)`)
getHoldCount()當前線程重入次數
getQueueLength()等待鎖的線程數
hasQueuedThreads()是否有線程等待
isHeldByCurrentThread()當前線程是否持有鎖
isLocked()鎖是否被任一線程持有

Condition:精準的線程協作

Condition 由 Lock 建立(lock.newCondition()),一個 Lock 可建立多個 Condition,實現「精準喚醒」(vs notify() 隨機喚醒)。

Lock lock = new ReentrantLock();
Condition notEmpty = lock.newCondition();
Condition notFull  = 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(); }

Condition 進階方法

  • awaitUninterruptibly():忽略中斷,不拋異常
  • awaitUntil(Date deadline):絕對時間超時喚醒
  • awaitNanos(timeout):奈秒級超時

ReadWriteLock:讀寫分離提升併發

ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
Lock readLock = rwLock.readLock();
Lock writeLock = rwLock.writeLock();

// 讀操作:共享鎖,多線程並發讀
readLock.lock();
try { return data.get(key); } finally { readLock.unlock(); }

// 寫操作:排他鎖,獨佔
writeLock.lock();
try { data.put(key, value); } finally { writeLock.unlock(); }

鎖規則:讀讀共存、讀寫互斥、寫寫互斥。適合「讀多寫少」場景(如快取、配置表)。

實戰效能對比

  • synchronized:JVM 優化後效能不錯,但功能單一
  • ReentrantLock:高併發下吞吐略優,功能豐富
  • ReadWriteLock:讀多寫少場景下大幅超越獨佔鎖

最佳實踐提醒

  1. 永遠在 finally 中 unlock()
  2. 避免在鎖內呼叫外部方法/耗時操作
  3. 公平鎖吞吐較低,除非有「飢餓」問題否則用非公平
  4. Condition 必須在持有鎖時調用 await/signal
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved