如果wait()方法不在同步块中,代码的确会抛出IllegalMonitorStateExeception:
public class WaitInSyncBlockTest {
@Test
public void test() {
try {
new Object().wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
结果是:
但是,为毛呢??为毛呢?我也不知道啊。
机智如我立刻假装正在开会忙得不可开交,回了一条:“开会中,今晚吃饭和你细说。”
经过一番谷歌百度之后,我找到了答案。
Lost Wake-Up Problem
事情得从一个多线程编程里面臭名昭著的问题"Lost wake-up problem"说起。
这个问题并不是说只在Java语言中会出现,而是会在所有的多线程环境下出现。
假如我们有两个线程,一个消费者线程,一个生产者线程。生产者线程的任务可以简化成将count加一,而后唤醒消费者&#