reentrantlock 是 java 中可重入的显式锁,需手动 lock()/unlock() 配对使用,推荐 try-finally 确保释放;支持公平性、trylock 超时获取及条件变量,且 lock/unlock 必须同线程调用。

ReentrantLock 是 Java 中可重入的显式锁,相比 synchronized 更灵活,支持公平锁、非公平锁、尝试加锁、超时获取、条件变量等特性。使用它必须手动加锁和释放锁,且释放操作应放在 finally 块中,防止因异常导致锁未释放。
基本用法:lock() + unlock() 配对使用
最基础的使用方式是调用 lock() 获取锁,执行完临界区逻辑后在 finally 中调用 unlock() 释放锁。
- lock() 是阻塞式获取锁,若锁被占用,当前线程会一直等待
- unlock() 必须与 lock() 成对出现,且只能由持有锁的线程调用,否则抛出 IllegalMonitorStateException
- 不配对或重复释放会导致程序异常或死锁风险
推荐写法:try-finally 确保锁一定释放
无论临界区是否抛出异常,都必须释放锁。标准写法如下:
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
// 执行需要同步的代码,例如修改共享变量
sharedValue++;
} finally {
lock.unlock(); // 关键:必须放在这里
}
进阶用法:tryLock() 实现非阻塞或带超时的加锁
当不想无限等待时,可用 tryLock() 尝试获取锁:
- 无参 tryLock():立即返回 boolean,true 表示成功获取锁,false 表示锁已被占用
- 带超时的 tryLock(long timeout, TimeUnit unit):最多等待指定时间,期间获取到锁则返回 true,超时仍未获取则返回 false
- 使用 tryLock 时,只有获取成功才需要 unlock;失败时不能调用 unlock()
注意点:锁的可重入性与线程绑定
ReentrantLock 是可重入的,同一线程可多次 lock(),但必须调用相同次数的 unlock() 才真正释放锁。
- lock() 和 unlock() 必须在同一线程中成对出现
- 不能在一个线程中 lock,在另一个线程中 unlock
- 建议每个锁实例只用于保护一组相关的共享资源,避免混用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











