reentrantlock.trylock(long timeout, timeunit unit) 是带超时的非阻塞加锁方法,成功返回true,超时或中断则返回false或抛异常;需配对unlock,超时精度受系统影响,公平模式下获取难度更高。

ReentrantLock.tryLock(long timeout, TimeUnit unit) 是 Java 提供的带超时的非阻塞加锁方法,它不会无限等待,而是在指定时间内尝试获取锁;成功则立即返回 true,超时未获取到则返回 false,整个过程不阻塞线程(但内部可能短暂自旋或挂起)。
核心行为:非阻塞 + 可中断 + 超时控制
这个方法不是纯“忙等”,也不是完全不挂起。它的实际策略是:
- 先尝试快速非阻塞地获取锁(类似
tryLock()无参版),成功直接返回true - 失败后,若超时时间 > 0,则进入 AQS 的同步队列,并注册一个“带截止时间”的等待节点
- 在等待过程中,如果被中断,抛出
InterruptedException - 如果等待期间锁被释放,且当前线程抢到了锁,返回
true - 如果等待超时仍未获得锁,自动退出等待,返回
false
典型用法示例
以下是一个安全、可中断、带超时的加锁写法:
ReentrantLock lock = new ReentrantLock();
try {
if (lock.tryLock(3, TimeUnit.SECONDS)) {
try {
// ✅ 成功获取锁,执行临界区逻辑
doSomethingCritical();
} finally {
lock.unlock(); // 必须确保释放
}
} else {
// ❌ 超时未获取到锁,执行降级或重试逻辑
handleLockTimeout();
}
} catch (InterruptedException e) {
// ⚠️ 线程在等待过程中被中断
Thread.currentThread().interrupt(); // 恢复中断状态
}
关键注意事项
-
必须配对使用
unlock():只有tryLock()返回true后才应调用unlock();否则会抛IllegalMonitorStateException - 超时时间精度有限:底层依赖系统时钟和线程调度,实际等待可能略长于设定值(尤其在高负载下)
-
公平锁影响行为:若构造时传入
true(公平模式),tryLock(timeout, ...)仍遵循 FIFO,可能比非公平模式更难抢到锁,即使超时较短 -
不响应
Thread.stop()等已废弃操作,只响应标准中断
和普通 lock()、无参 tryLock() 的区别
-
lock():阻塞直到获取锁,不可中断(除非使用lockInterruptibly()) -
tryLock()(无参):仅尝试一次,立即返回true或false,完全不等待 -
tryLock(timeout, unit):在指定窗口内“尽力而为”获取锁,兼顾响应性和可控性,适合有 SLA 要求或需避免长等待的场景
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











