我有两个线程。在一个立即启动的线程中,有这样的代码
public void run(){ MONITOR.wait(); ...}
在第二个线程中,在第一个线程之后 10 秒开始,以下代码:
public void run(){ MONITOR.notify(); MONITOR.wait();...}
是否有可能两个线程都在等待?我在一次采访中被问到这样一个问题,我说我不能,我被告知你错了,想想。谁是对的?Java doc 站在我这边,但我仍然想澄清一下。你能举一个例子说明两个线程由于某种原因同时处于等待状态吗?对于第二个问题,首先想到的是在第二个线程中交换等待和通知。
在我看来,最简单的答案如下。如果系统负载很重,那么即使第一个线程提前 10 秒启动,这并不意味着它会首先捕获监视器并进入同步块(在此之前,计算机上优先级较高的任务可能被执行)。因此,当第二个线程首先捕获监视器时,这种情况是可能的。因此,第二个线程可以执行 MONITOR.notify(); 当 MONITOR.wait() 尚未在第一个线程上调用时;结果,两个线程都进入等待状态。