synchronized 关键字在锁等待阶段不可中断,线程处于 Blocked 状态时调用 interrupt() 仅设置中断标志但不退出等待;进入同步块后执行可中断操作(如 wait、sleep)才可响应中断;需可中断锁等待应使用 ReentrantLock.lockInterruptibly()。

synchronized 关键字本身不支持中断响应,具体来说:它无法让正在等待获取锁的线程响应 Thread.interrupt() 并提前退出等待状态。
synchronized 等待过程不可中断
当多个线程竞争同一个 synchronized 锁时,未获得锁的线程会进入 Blocked 状态。此时即使调用该线程的 interrupt() 方法:
- 中断标志会被设为 true,但线程仍停留在 Blocked 状态,继续等待锁释放;
- 不会抛出
InterruptedException; - 也不会主动退出等待,直到持有锁的线程释放锁后才可能被调度获取锁。
进入同步块后可被中断
一旦线程成功获取 synchronized 锁、进入同步代码块或方法内部,其行为就与普通线程无异。此时若执行了可中断的阻塞操作(如 Thread.sleep()、Object.wait()、Thread.join()),则能正常响应中断:
- 这些方法在被中断时会抛出
InterruptedException; - 中断标志在抛异常时自动重置为 false;
- 开发者可在 catch 块中处理退出逻辑,实现受控终止。
替代方案:用 ReentrantLock 实现可中断等待
如果需要“等待锁时也能被中断”,应使用 java.util.concurrent.locks.ReentrantLock 提供的 lockInterruptibly() 方法:
立即学习“Java免费学习笔记(深入)”;
- 调用该方法尝试获取锁时,若线程被中断,会立即抛出
InterruptedException,并放弃等待; - 相比 synchronized,它提供了更细粒度的控制能力(如超时、公平性、多条件队列等);
- 需注意必须显式调用
unlock(),建议配合 try-finally 或 try-with-resources(配合自定义封装)确保释放。
常见误区澄清
有人看到 synchronized 方法内抛出 InterruptedException 就误以为 “synchronized 可中断”,这是混淆了两个不同阶段:
- 锁等待阶段(抢锁失败、Blocked)→ 不可中断;
- 锁持有阶段(已进入同步块、执行业务逻辑)→ 可中断,但中断的是内部阻塞操作,不是锁本身。


















