reentrantlock.trylock()是立即返回的非阻塞锁获取方式,成功返回true并持锁,失败返回false不等待;支持超时重载,可中断,相比synchronized更灵活可控。

ReentrantLock.tryLock() 是一种非阻塞式获取锁的方式,调用后立即返回结果,不会让线程陷入等待。它适合对响应性要求高、需避免死锁或需实现“尽力而为”逻辑的场景。
tryLock() 的基本用法
直接调用 tryLock() 无参方法,它会立刻尝试获取锁:
- 成功获取锁 → 返回 true,当前线程持有锁,可安全执行临界区代码;
- 锁已被其他线程占用 → 返回 false,当前线程不等待,继续执行后续逻辑。
示例:
ReentrantLock lock = new ReentrantLock();
if (lock.tryLock()) {
try {
// 执行临界区操作
doSomethingCritical();
} finally {
lock.unlock(); // 必须确保释放
}
} else {
// 锁不可用,走降级/重试/跳过等策略
handleLockUnavailable();
}
带超时的 tryLock(long time, TimeUnit unit)
若希望“最多等待一段时间”,可用带超时的重载方法:
- 在指定时间内成功获取锁 → 返回 true;
- 超时仍未获取到锁 → 返回 false,线程不会被挂起;
- 等待期间线程被中断 → 抛出 InterruptedException,需捕获处理。
注意:该方法是可中断的,适合需要响应中断信号的场景。
与 synchronized 的关键区别
不同于 synchronized 的隐式阻塞行为,tryLock() 提供了显式的控制权:
- 不强制串行化所有访问,允许“锁忙时快速失败”;
- 可结合业务逻辑做弹性处理(如重试、缓存读取、异步补偿);
- 避免因锁竞争导致线程长时间阻塞,提升系统吞吐和可观测性。
使用注意事项
使用 tryLock() 时需特别注意:
- 必须配对 unlock(),且仅在 tryLock() 返回 true 后才调用;
- 不能在 finally 块外释放锁,否则可能引发 IllegalMonitorStateException;
- 避免在未获取锁的情况下误执行临界区逻辑;
- 若频繁失败,应检查锁粒度是否过大、是否存在长持有锁的操作。










