Java 如果一个线程在调用Object.wait()之前被中断,该线程会在抛出InterruptedException之前释放锁吗

Java 如果一个线程在调用Object.wait()之前被中断,该线程会在抛出InterruptedException之前释放锁吗,java,multithreading,Java,Multithreading,JDK文档中提到了这一点 如果当前线程在等待之前或等待期间被任何线程中断,则抛出>InterruptedException。在如上所述恢复此>对象的锁定状态之前,不会引发此异常 我只想绝对确定使用“restored”一词意味着必须释放并重新获取锁,而不是由调用对象的线程持续保持。wait()。换句话说,有可能先将锁授予其他线程 我只想绝对确定使用“restored”一词意味着必须释放并重新获取锁,而不是由调用对象的线程持续保持。wait()。换句话说,有可能先将锁授予其他线程 永远不能保证先将锁

JDK文档中提到了这一点

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

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

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

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

在早期线程中断的情况下,实现可能允许绕过锁的释放和重新获取,在规范允许发生虚假唤醒的情况下,它甚至可以不中断地这样做

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

委员会:

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

synchronized (obj) {
    while (<condition does not hold>)
        obj.wait(timeout);
    ... // Perform action appropriate to condition
}
synchronized(obj){
而()
对象等待(超时);
…//执行适合条件的操作
}

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

请注意,锁永远不会被调用对象的线程连续持有。wait()。事实上,Object.wait()会释放锁(但会在它返回到代码之前重新获取锁)。如果这很重要,那么您就是做错了什么。(例如,您试图使用锁在线程之间强制执行某种顺序。)这是行不通的。
synchronized
的唯一保证是不允许两个线程同时在同一对象上同步。当多个线程尝试在同一对象上同步时,它不能保证线程成功的顺序。(@Holger更深层次的回答为+1)。