繁体   English   中英

同步块中的notify()

[英]notify() in synchronized block

我在项目中找到了打击代码。 但是我不明白为什么唯一的notify()方法是在sync block中。

synchronized(this){
  notify();
}

这段代码是否合乎逻辑,如果是的话,真正的目的是什么?

您应该仅从拥有对象监视器的线程中调用notify 文档中

此方法只能由作为该对象的监视器的所有者的线程调用。 线程通过以下三种方式之一成为对象监视器的所有者:

  • 通过执行该对象的同步实例方法。
  • 通过执行在对象上同步的同步语句的主体。
  • 对于类类型的对象,通过执行该类的同步静态方法。

(我的重点)

要理解它为什么有意义,请考虑必须在同一对象上同步其他块,这些块将被该块唤醒。

看看这个:

http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html

notify()唤醒在同一对象上调用wait()的第一个线程。

class ThreadB extends Thread{
int total;
@Override
public void run(){
    synchronized(this){
        for(int i=0; i<100 ; i++){
            total += i;
        }
        notify();
    }
}

像上面的例子一样,我们使用notify向其他正在等待的线程发送信息消息(嘿,我完成我的工作,醒了!)。 所以在您的问题上,这没有意义

这不一定是错误的,但绝对是一个不好的信号。 在该代码的其他地方,将无条件wait 例如:

synchronized(this) {
    wait();
}

现在可能可以正常工作。 但是,如果在wait之前执行了notify则将导致死锁。

通常,您要在某种情况下等待:

synchronized(this) {
    while(!this.flag) {
        this.wait();
    }
}

并使用这样的notify

synchronized(this) {
    this.flag = true;
    this.notify();
}

这将永远不会陷入僵局,而且很明显我们在等待什么。

暂无
暂无

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

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