wait()抛出InterruptedException时,线程是否持有对象监视器?代码场景求证
Java wait()与监视器持有问题详解
嘿,我来帮你理清这两个关于Java wait()方法和监视器锁的问题,这可是并发编程里的常见坑点哦!
问题1:若wait()抛出InterruptedException,线程是否会等待直至获取对象的监视器?
答案是肯定的。不管wait()是因为被notify()/notifyAll()唤醒正常返回,还是因为线程被中断抛出InterruptedException,线程在从wait()方法返回(包括抛出异常的情况)之前,都会重新等待并获取到该对象的监视器锁。这是Java语言规范明确规定的行为——wait()方法的所有退出路径,都要求线程重新持有对象的监视器,不会出现"抛出异常时没拿到锁"的情况。
问题2:示例代码中,执行e.printStackTrace()时是否能保证持有该对象的监视器?
是的,完全可以保证。咱们拆解下这段代码的执行流程:
- 进入
synchronized修饰的get()方法时,线程已经成功获取了当前对象的监视器锁。 - 调用
wait()后,线程会主动释放监视器锁,进入等待状态。 - 当线程因为被中断触发
InterruptedException时,它不会立刻抛出异常,而是先重新等待并成功获取当前对象的监视器锁,之后才会进入catch块执行代码。
所以当执行e.printStackTrace()的时候,线程肯定持有该对象的监视器锁。
补充说明
你提到资料里说"wait()经notify()或notifyAll()调用后返回时,线程会等待直至获取对象的监视器",其实这个规则对InterruptedException的情况同样适用——wait()的任何返回场景(正常唤醒、中断唤醒),都遵循"先重新获取监视器,再退出方法"的逻辑,这是Java并发机制的统一规范。
内容的提问来源于stack exchange,提问作者fhucho
相关产品推荐
相关产品推荐

