6

考虑到 wait() 只能在同步上下文中调用,随后释放监视器,直到另一个线程在同一个对象上调用了 notify/nofityAll,

假设线程 A 在 wait() 上阻塞,导致线程 B 获取锁。现在如果我们中断线程 A,控制权会立即转移到线程 A 吗?在这种情况下,由于处理 InterrupException 的 try catch 块在同步上下文中,并且由于一次只有一个线程可以持有监视器,线程 B 会发生什么?是否应该在线程 A 完成执行之前进入阻塞状态?

提前致谢

4

2 回答 2

9

阅读文档实际上会有所帮助:

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#wait%28long%29

因此,当线程中断时,它必须重新获取Object的监视器,以恢复抛出异常之前的同步状态。在经过指定的时间后从 wait(long) 调用返回也是如此。

然后将线程 T 从该对象的等待集中移除,并重新启用线程调度。然后它以通常的方式与其他线程竞争对象同步的权利;一旦它获得了对象的控制权,它对对象的所有同步声明都会恢复到之前的状态——即,恢复到调用等待方法时的状态。线程 T 然后从调用等待方法返回。因此,从等待方法返回时,对象和线程 T 的同步状态与调用等待方法时完全相同。

如果当前线程在等待时被另一个线程中断,则抛出 InterruptedException。在此对象的锁定状态已按上述恢复之前,不会引发此异常。

于 2011-11-09T20:29:23.173 回答
2

我相信 A 将变得可运行,但会等到它可以获取锁,然后再继续执行 catch 子句。它不会强制 B 进入阻塞状态。同步块的全部意义在于保证持有锁的线程在放弃锁之前没有其他线程可以同步同一个锁。强制 B 进入阻塞状态并让 A 重新获得锁将违反同步的本质。

于 2011-11-09T20:25:35.857 回答