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

时间:2013-07-08 19:52:59

标签: java exception-handling synchronization signals wait

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

但是,在事件Object.wait()引发异常(例如Interrupted Exception)时会发生什么情况不太明确。我推断它确实在抛出异常之前重新获取了锁。但是,文档对此并不十分明确,所以我不是百分百肯定......

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

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

1 个答案:

答案 0 :(得分:5)

JLSObject#wait的Javadoc详细说明了这一点。根据该文本,必须无条件地重新获取锁。引用相关位:

  
      
  1. 将线程 t 添加到对象 m 的等待集中,并对 m <执行 n 解锁操作/ EM>

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

         
        
    • [...]

    •   
    • 正在对 t 执行中断操作。

    •   
  4.   
  5. 线程 t m 上执行 n 锁定操作。

  6.