You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

wait()抛出InterruptedException时,线程是否持有对象监视器?代码场景求证

Java wait()与监视器持有问题详解

嘿,我来帮你理清这两个关于Java wait()方法和监视器锁的问题,这可是并发编程里的常见坑点哦!

问题1:若wait()抛出InterruptedException,线程是否会等待直至获取对象的监视器?

答案是肯定的。不管wait()是因为被notify()/notifyAll()唤醒正常返回,还是因为线程被中断抛出InterruptedException,线程在从wait()方法返回(包括抛出异常的情况)之前,都会重新等待并获取到该对象的监视器锁。这是Java语言规范明确规定的行为——wait()方法的所有退出路径,都要求线程重新持有对象的监视器,不会出现"抛出异常时没拿到锁"的情况。

问题2:示例代码中,执行e.printStackTrace()时是否能保证持有该对象的监视器?

是的,完全可以保证。咱们拆解下这段代码的执行流程:

  1. 进入synchronized修饰的get()方法时,线程已经成功获取了当前对象的监视器锁。
  2. 调用wait()后,线程会主动释放监视器锁,进入等待状态。
  3. 当线程因为被中断触发InterruptedException时,它不会立刻抛出异常,而是先重新等待并成功获取当前对象的监视器锁,之后才会进入catch块执行代码。

所以当执行e.printStackTrace()的时候,线程肯定持有该对象的监视器锁。

补充说明

你提到资料里说"wait()经notify()或notifyAll()调用后返回时,线程会等待直至获取对象的监视器",其实这个规则对InterruptedException的情况同样适用——wait()的任何返回场景(正常唤醒、中断唤醒),都遵循"先重新获取监视器,再退出方法"的逻辑,这是Java并发机制的统一规范。

内容的提问来源于stack exchange,提问作者fhucho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:22:10