我正在使用的Java文档清楚地表明Object.wait()
方法在返回之前需要关联的监视器,无论它是否被通知或者是虚假的唤醒;任何正常的方法返回都将在监视器重新获取之前。
但是,在事件Object.wait()
引发异常(例如Interrupted Exception
)时会发生什么情况不太明确。我推断它确实在抛出异常之前重新获取了锁。但是,文档对此并不十分明确,所以我不是百分百肯定......
以下是我正在查看的文档: http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#wait%28%29
那么,我的推理是否正确,或者我的调用代码是否需要在抛出异常后解决监视器状态(例如,在必要时重新获取它)?
答案 0 :(得分:5)
JLS比Object#wait
的Javadoc详细说明了这一点。根据该文本,必须无条件地重新获取锁。引用相关位:
将线程 t 添加到对象 m 的等待集中,并对 m <执行 n 解锁操作/ EM>
线程 t 在从 m 的等待集中删除之前不会执行任何进一步的指令。由于以下任何一种操作,线程可能会从等待集中删除,并且会在之后的某个时间恢复:
[...]
正在对 t 执行中断操作。
- 醇>
线程 t 在 m 上执行 n 锁定操作。