Java中ReentrantLock通过显式lock()/unlock()实现可重入互斥锁,支持公平/非公平模式,需在finally中释放锁,允许多次加锁对应多次解锁,并提供tryLock()实现非阻塞或超时获取。

Java 中用 ReentrantLock 实现可重入互斥锁,核心是显式获取和释放锁,并利用其“可重入”特性(同一线程可多次加锁,需对应次数解锁)。
创建并初始化 ReentrantLock
在需要同步的类中声明一个 ReentrantLock 实例,通常用 final 修饰,推荐使用公平锁或非公平锁根据场景选择:
- 非公平锁(默认,吞吐量高):
private final ReentrantLock lock = new ReentrantLock(); - 公平锁(按等待顺序获取,避免饥饿):
private final ReentrantLock lock = new ReentrantLock(true);
在临界区使用 lock() 和 unlock()
必须成对调用 lock() 和 unlock(),且 unlock() 应放在 finally 块中,确保异常时也能释放锁:
lock.lock();
try {
// 临界区代码,例如修改共享变量
count++;
} finally {
lock.unlock(); // 必须执行,否则会导致死锁
}
支持可重入:同一线程可重复加锁
ReentrantLock 允许当前持有锁的线程再次调用 lock(),内部会维护锁持有计数。每次 lock() 对应一次 unlock():
- 线程 A 调用
lock()→ 计数变为 1 - 线程 A 再次调用
lock()→ 计数变为 2 - 线程 A 调用两次
unlock()→ 计数归零,锁才真正释放
这种机制让递归调用或嵌套同步逻辑更安全,无需担心自己锁死自己。
可选:使用 tryLock() 实现非阻塞或超时获取
如果不想无限等待锁,可用 tryLock():
- 立即尝试:
if (lock.tryLock()) { ... } else { /* 获取失败 */ } - 带超时:
if (lock.tryLock(1, TimeUnit.SECONDS)) { ... } // 1秒内未获取到则返回 false
注意:无论是否成功,只要 tryLock() 返回 true,就必须在 finally 中调用 unlock()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











