6

我使用的 Java 文档清楚地表明,该Object.wait()方法在返回之前需要关联的监视器,无论它是被通知还是虚假唤醒;任何正常的方法返回都将在监视器重新获取之前。

但是,对于Object.wait()引发异常的事件(例如Interrupted Exception. 我推断它确实在抛出异常之前重新获取了锁。但是,文档不是很明确,所以我不是 100% 确定...

这是我正在查看的文档:http: //docs.oracle.com/javase/6/docs/api/java/lang/Object.html#wait%28%29

那么,我的推断是否正确,或者我的调用代码是否需要在抛出异常后处理监视器状态(例如,如果需要,重新获取它)?

4

1 回答 1

5

JLSObject#wait比's Javadoc更详细地指定了这一点。根据该文本,必须无条件地重新获取锁。引用相关位:

  1. 线程t被添加到对象m的等待集中,并对m执行n 个解锁操作。

  2. 线程t在从m的等待集中移除之前不会执行任何进一步的指令。由于以下任一操作,线程可能会从等待集中移除,并将在之后的某个时间恢复:

    • [...]

    • 在t上执行的中断操作。

  3. 线程t对m执行n 个锁定操作。

于 2013-07-08T20:14:12.607 回答