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();
}
}
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 中執行。