贝利信息

在Java里ReentrantLock相比synchronized有什么优势_Java锁机制对比说明

日期:2026-01-21 00:00 / 作者:P粉602998670
ReentrantLock的核心优势是“可控”而非“更快”,支持lockInterruptibly()响应中断、多Condition精准唤醒、tryLock()避免死锁,但需严格配对lock/unlock且公平锁性能差。

ReentrantLock 的核心优势不是“更快”,而是“可控”——它把锁的生命周期、等待策略、唤醒逻辑,全交到你手上。

什么时候必须用 lockInterruptibly()

当线程在等锁时,你希望它能被外部中断(比如服务优雅停机、超时熔断),synchronized 完全做不到。JVM 会忽略中断信号,线程卡在 monitorenter 就是死等。

为什么需要多个 Condition 而不是只靠 wait()/notifyAll()

一个 synchronized 块只能配一套 wait/notify,所有等待线程挤在一个队列里。而 ReentrantLock 可以按业务语义分组唤醒,避免“惊群效应”。

tryLock(long, TimeUnit) 解决什么真实问题?

它不是为了“抢锁快”,而是为了打破死锁僵局或实现非阻塞协作。

公平锁参数 new ReentrantLock(true) 别乱开

公平锁看起来“更合理”,但代价是性能暴跌——所有线程必须排队进 CLH

队列,连自旋机会都没有。

真正容易被忽略的点:用 ReentrantLock 时,lock()unlock() 必须严格成对,且 unlock() 一定要写在 finally 里——哪怕只漏一次,整个系统就可能卡死。而 synchronized 的“自动释放”不是便利性优势,是安全底线。