繁体   English   中英

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

[英]Why should the notify method be inside a synchronized block?

请考虑以下代码: -

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
        }
    }
} 

另一个类通过在同步块内获取锁定来等待此类的实例。 但是如果我没有在同步块中保存run方法中的代码,那么我会得到IllegalMonitorStateException

notify()应该意味着向所有等待的线程发出信号。 那为什么它应该在同步块内呢?

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

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

那为什么它应该在同步块内呢?

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

如果notify()方法不在synchronized块内,那么将wait()放入synchronized块是没用的。
采用生产者 - 消费者模型,生产者和消费者的方案,这两种方法将同时执行,因为其中一个方法不同步。 会有竞争条件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM