请考虑以下代码: -
class CalculateSeries implements Runnable{
int total;
public void run(){
synchronized(this){ // *LINE 1*
for(int i = 1; i <= 10000; i++) {
total += i;
}
notify(); //Notify all the threads waiting on this instance of the class to wake up
}
}
}
另一个类正在等待这个类的一个实例,方法是在一个synchronized块中获取它。但是如果我不在同步块中保存run方法中的代码,那么我得到IllegalMonitorStateException
。
notify()
应该意味着向所有等待的线程发出信号。那为什么它应该在synchronized块内?
答案 0 :(得分:4)
notify()应该意味着向所有等待的线程发出信号。
实际上,没有。它发出一个任意选择的等待线程的信号。 notifyAll()
向所有人发出信号。
那为什么它应该在synchronized块内?
因为等待不是为了它自己而发生的。你检查一个条件,如果没有达到,你就等到有人告诉你它现在可以满足(然后再检查)。如果没有同步,您将在检查条件和实际等待之间遇到竞争条件。
答案 1 :(得分:0)
如果notify()方法不在同步块中,则将wait()放入同步块中将是没有用的。
以生产者-消费者模型,生产者和消费者这两种情况为例,这两种方法将同时执行,因为其中之一是不同步的。会有比赛情况。