trylock 是 reentrantlock 的非阻塞加锁方法,立即返回 true 或 false;提供无参和超时两个重载版本,需配合 volatile/原子变量做状态检查,失败后应 yield、休眠或降级处理,并确保成功加锁后在 finally 中显式 unlock。

tryLock 是 ReentrantLock 提供的非阻塞加锁方式,它不等待、不挂起线程,而是立即返回结果——成功获得锁就返回 true,否则立刻返回 false。 这种行为是实现非阻塞式编程的关键基础,避免了传统 synchronized 或 lock() 带来的线程阻塞和上下文切换开销。
tryLock 的两种调用形式与适用场景
ReentrantLock 提供两个 tryLock 重载方法:
- tryLock():无参版本,尝试获取锁一次,立即返回 boolean 结果。适合“有锁就干,没锁就走”的简单策略。
- tryLock(long timeout, TimeUnit unit):带超时版本,在指定时间内轮询尝试获取锁,期间线程不会被阻塞(处于 RUNNABLE 状态,可响应中断)。适合需要有限等待但又不能无限阻塞的场景,比如资源竞争较激烈但允许短暂让步。
配合 volatile 或原子变量做状态检查
单纯 tryLock 只解决“能否加锁”,非阻塞编程真正落地还需结合业务状态判断。常见做法是用 volatile 字段或 AtomicBoolean 标记临界资源是否就绪或正在处理:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:一个缓存刷新任务,先 tryLock() 成功 → 再检查 volatile isRefreshing 是否为 false → 若是,设为 true 并执行刷新;若否,说明其他线程已在处理,直接放弃。
- 关键点:lock 保护的是共享状态的修改,而 volatile/Atomic 变量用于快速读取状态,减少锁竞争频率。
失败后主动让出 CPU 或退避重试
tryLock 返回 false 后,不能忙等(如 while(!tryLock()) {}),否则浪费 CPU。合理做法包括:
- 调用 Thread.yield() 让出当前调度时间片,给其他线程机会;
- 短暂停顿(如 LockSupport.parkNanos(100) 或 TimeUnit.NANOSECONDS.sleep(100));
- 转为异步处理:把任务提交到线程池、放入队列,或触发事件通知;
- 降级处理:返回缓存旧值、返回默认结果或抛出特定异常(如 BusyException)。
注意可重入性与锁释放的确定性
tryLock 获得的锁仍具备 ReentrantLock 的全部特性,包括可重入和必须显式 unlock:
- 务必在 finally 块中 unlock(),否则会导致死锁风险;
- 即使 tryLock 失败,也不能调用 unlock() —— 必须确保只对成功加锁的路径执行释放操作;
- 可重入场景下,多次 tryLock 成功需对应相同次数的 unlock,否则会影响后续加锁逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










