可重入锁允许同一线程多次获取同一把锁而不阻塞,通过持有计数器和独占线程标识实现;支持公平/非公平模式;需手动释放且必须在finally中调用unlock();具备可中断、尝试获取、超时获取及多条件变量等synchronized不具备的能力。

可重入锁,就是同一个线程可以反复获取同一把锁而不被自己阻塞的锁。
ReentrantLock 内部维护一个持有计数器(hold count)和一个独占线程标识(exclusiveOwnerThread)。当线程第一次调用 lock() 时,计数器设为 1,线程被记录为持有者;再次调用 lock(),计数器加 1;每次 unlock() 都减 1。只有计数器归零时,锁才真正释放,其他线程才有机会抢到。
这种机制让递归调用、嵌套同步逻辑成为可能,比如外层方法加锁后调用内层也需加同一把锁的方法,不会卡死。
ReentrantLock 构造时可传 boolean fair 参数:
立即学习“Java免费学习笔记(深入)”;
注意:公平锁不保证调度公平,也不影响 tryLock() 行为——它始终是非公平的,即使在公平锁实例上调用。
和 synchronized 不同,ReentrantLock 是显式锁,必须配对使用 lock() 和 unlock(),且 unlock() 必须放在 finally 块里,否则一旦临界区抛异常,锁就永远无法释放。
标准写法是:
lock.lock();
try {
// 业务代码
} finally {
lock.unlock();
}
基本上就这些。
以上就是Java里什么是可重入锁_Java ReentrantLock特性与使用方式解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号