lockinterruptibly()可在等待锁时响应中断并抛出interruptedexception,而lock()不可中断、会持续阻塞;正确使用需try-catch异常、恢复中断状态并finally中按条件unlock。

Java 中通过 ReentrantLock 的 lockInterruptibly() 方法,可以在等待获取锁的过程中响应中断信号,从而让线程提前退出阻塞状态,而不是一直傻等。
lockInterruptibly 与普通 lock 的关键区别
普通 lock() 方法在获取锁失败时会一直阻塞,**忽略中断请求**;而 lockInterruptibly() 在等待期间如果被其他线程调用 interrupt(),会立即抛出 InterruptedException 并释放等待资格,不会继续阻塞。
-
lock():不可中断,即使线程已被中断,仍会继续等待锁释放 -
lockInterruptibly():可中断,一旦检测到中断状态(或在等待中收到中断),立刻抛异常退出
正确使用 lockInterruptibly 的基本模式
必须将 lockInterruptibly() 放在 try 块中,并捕获 InterruptedException;同时确保无论是否成功加锁,都在 finally 中调用 unlock()。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
ReentrantLock lock = new ReentrantLock();
try {
lock.lockInterruptibly(); // 可能抛 InterruptedException
// 执行临界区逻辑
} catch (InterruptedException e) {
// 当前线程被中断,清理资源、退出或重试等
Thread.currentThread().interrupt(); // 恢复中断状态(推荐)
return; // 或 throw new RuntimeException(e);
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
中断信号是怎么传进来并被感知的
中断不是“主动推送”,而是由其他线程调用目标线程的 interrupt() 方法设置其中断状态。当线程在 lockInterruptibly() 内部等待时,JVM 会定期检查该状态,一旦发现已中断,就抛出异常。
- 中断发生时机:仅在等待锁的过程中有效(已持有锁时调用
interrupt()不影响当前执行) - 中断后状态:异常抛出后,线程的中断标志会被自动清除,所以通常需要手动恢复:
Thread.currentThread().interrupt() - 注意:不能靠
isInterrupted()轮询判断——lockInterruptibly()自身就负责响应和抛异常
典型适用场景
适合需要“带超时/可取消”的同步操作,比如任务调度、响应式服务、长时间等待资源的客户端逻辑。
- 线程池中提交的任务需支持取消(如 Future.cancel(true))
- 用户主动取消某个耗时操作(如 UI 点击“停止”触发后台线程中断)
- 避免死锁风险:配合中断机制实现有限等待 + 回退策略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










