Lock lock = new ReentrantLock();
lock.lock();
try {
// 臨界區
} finally {
lock.unlock(); // 必須在 finally 釋放,防異常洩漏
}
優勢:可中斷鎖、公平/非公平選擇、嘗試獲取、超時獲取、多條件變數。
| 方法 | 用途 |
|---|---|
lockInterruptibly() | 可中斷獲取鎖,線程被 interrupt 即拋 InterruptedException |
tryLock() | 非阻塞嘗試,立即返回成功/失敗 |
tryLock(time, unit) | 限時嘗試獲取 |
isFair() | 查詢是否公平鎖(建構式 `new ReentrantLock(true)`) |
getHoldCount() | 當前線程重入次數 |
getQueueLength() | 等待鎖的線程數 |
hasQueuedThreads() | 是否有線程等待 |
isHeldByCurrentThread() | 當前線程是否持有鎖 |
isLocked() | 鎖是否被任一線程持有 |
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(); }
awaitUninterruptibly():忽略中斷,不拋異常awaitUntil(Date deadline):絕對時間超時喚醒awaitNanos(timeout):奈秒級超時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:讀多寫少場景下大幅超越獨佔鎖finally 中 unlock()await/signal