为什么notify方法应该在synchronized块中?

时间:2012-01-11 09:54:47

标签: java multithreading

请考虑以下代码: -

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块内?

2 个答案:

答案 0 :(得分:4)

  

notify()应该意味着向所有等待的线程发出信号。

实际上,没有。它发出一个任意选择的等待线程的信号。 notifyAll()向所有人发出信号。

  

那为什么它应该在synchronized块内?

因为等待不是为了它自己而发生的。你检查一个条件,如果没有达到,你就等到有人告诉你它现在可以满足(然后再检查)。如果没有同步,您将在检查条件和实际等待之间遇到竞争条件。

答案 1 :(得分:0)

如果notify()方法不在同步块中,则将wait()放入同步块中将是没有用的。
 以生产者-消费者模型,生产者和消费者这两种情况为例,这两种方法将同时执行,因为其中之一是不同步的。会有比赛情况。