如果线程在调用Object.wait()之前被中断,那么线程是否会在抛出InterruptedException之前解除锁定

时间:2014-09-01 14:25:36

标签: java multithreading

JDK Documentation提到了它,

  

如果当前线程在等待之前或期间被任何线程中断,则>抛出InterruptedException。在如上所述恢复此>对象的锁定状态之前,不会抛出此异常。

我只想绝对肯定使用word"恢复"表示必须释放并重新获取锁,而不是由调用Object.wait()的线程持续保持。换句话说,有可能首先将锁授予其他线程。

1 个答案:

答案 0 :(得分:2)

  

我只想绝对肯定使用“已恢复”一词意味着必须释放并重新获取锁,而不是由调用Object.wait()的线程持续保持。换句话说,有可能首先将锁授予其他线程。

永远保证首先将锁授予其他线程。即使线程释放锁并在之后重新获取它,它也可能在等待相同锁的任何其他线程获得机会之前重新获取锁。

实现可能允许在早期线程中断的情况下绕过释放并重新获取锁定,并且即使在没有中断的情况下也可以执行此操作虚假唤醒规范允许发生。

换句话说,当wait结束时,无论正常还是异常,都不保证任何其他线程已经运行。

documentation clearly says

  

线程也可以在没有被通知,中断或超时的情况下唤醒,即所谓的虚假唤醒。虽然这在实践中很少发生,但应用程序必须通过测试应该导致线程被唤醒的条件来防范它,并且如果条件不满足则继续等待。换句话说,等待应该总是出现在循环中,如下所示:

synchronized (obj) {
    while (<condition does not hold>)
        obj.wait(timeout);
    ... // Perform action appropriate to condition
}

这也适用于抛出InterruptionException的情况。当遵循如何使用内部锁定的一般规则时,您的问题变得无关紧要:如果一个线程在条件不成立时保持wait,则其他线程不等待此条件(或负责建立条件)最终会运行。