Object.wait()方法在抛出异常时是否重新获取监视器



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

然而,在Object.wait()抛出异常(例如Interrupted Exception)的事件中会发生什么还不太清楚。我推断它确实在抛出异常之前重新获取了锁。然而,文档并不是很明确,所以我不能100%确定。。。

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

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

JLS比Object#wait的Javadoc更详细地指定了这一点。根据该文本,必须无条件地重新获取锁。引用相关位:
  1. 线程t被添加到对象m的等待集,并对m执行n解锁操作。

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

    • […]

    • t上执行的中断操作。

  3. 线程tm执行n锁定操作。

最新更新