ReentrantLock 是 Java 显式可重入锁,支持公平性、中断响应、超时获取和条件变量;必须手动配对 lock() 与 finally 中的 unlock(),否则易致死锁;提供 lockInterruptibly() 和 tryLock(timeout) 等高级功能。

ReentrantLock 是 Java 并发包(java.util.concurrent.locks)中提供的显式可重入锁,相比 synchronized 更灵活,支持公平性选择、中断响应、超时获取、条件变量等高级功能。
基本用法:加锁与释放必须配对
ReentrantLock 不会自动释放,必须手动在 finally 块中调用 unlock(),否则极易造成死锁或线程饥饿。
- 声明锁对象:private final ReentrantLock lock = new ReentrantLock();
- 加锁:lock.lock(); —— 阻塞直到获取成功
- 释放锁:lock.unlock(); —— 必须放在 finally 中
支持中断的获取方式
当线程在等待锁时,可响应 interrupt(),避免无限阻塞。
- 使用 lock.lockInterruptibly();
- 调用后若被中断,抛出 InterruptedException,需捕获并处理
- 适合对响应性要求高的场景,如任务取消、超时控制
带超时的锁获取
避免线程长时间等待,提升系统健壮性。
立即学习“Java免费学习笔记(深入)”;
- 调用 lock.tryLock(timeout, unit);
- 返回 true 表示成功获取;false 表示超时未获取到
- 注意:超时期间若被中断,也会抛出 InterruptedException
可选公平策略与可重入特性
构造时传入 true 可启用公平模式(先到先得),默认非公平(吞吐更高);同一线程可重复获取锁,每次 lock() 都需对应一次 unlock()。
- 重入次数由锁内部维护,unlock() 每次减一,为 0 时才真正释放
- 可通过 getHoldCount() 查看当前线程持有锁的次数
- 用 isHeldByCurrentThread() 判断是否已持锁,便于条件化加锁
不复杂但容易忽略细节,关键是锁的生命周期要严格匹配,尤其别漏写 unlock()。



















