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

Java 多執行緒鎖機制:Lock 與 ReadWriteLock 實戰範例

     編輯:Java 相關知識

Lock 介面與 ReentrantLock

Lock 介面提供比 synchronized 更靈活的同步控制,支援可中斷、超時、公平鎖等特性。核心方法:lock()、unlock()。必須在 finally 區塊釋放鎖,避免死鎖。

範例:兩個執行緒交替列印名稱

Lock lock = new ReentrantLock();
void printName(String name) {
    lock.lock();
    try {
        for (char c : name.toCharArray()) System.out.print(c);
        System.out.println();
    } finally {
        lock.unlock();
    }
}

ReadWriteLock 讀寫鎖

ReentrantReadWriteLock 實作讀寫分離:允許多執行緒同時讀,但寫操作獨佔(讀寫、寫讀、寫寫互斥)。適用於「讀多寫少」的快取、資料結構場景。

範例:線程安全的快取實作

public class Cache {
    private final Map data = new HashMap<>();
    private final ReadWriteLock rwLock = new ReentrantReadWriteLock();

    public V get(K key, V fallback) {
        rwLock.readLock().lock();
        V value = data.get(key);
        if (value == null) {
            rwLock.readLock().unlock(); // 釋放讀鎖再獲取寫鎖
            rwLock.writeLock().lock();
            try {
                // 雙重檢查
                if ((value = data.get(key)) == null) {
                    value = fallback;
                    data.put(key, value);
                }
            } finally {
                rwLock.writeLock().unlock();
            }
            rwLock.readLock().lock(); // 重新獲取讀鎖以便返回
        }
        try { return value; }
        finally { rwLock.readLock().unlock(); }
    }
}

關鍵最佳實踐

  • 鎖釋放必須在 finally 中執行。
  • 讀寫鎖升級(讀→寫)需顯式釋放讀鎖再獲取寫鎖,注意竄改風險。
  • 避免在鎖內呼叫外部方法或耗時操作,縮小臨界區範圍。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved