调用notify()与结束同步块Java

时间:2018-10-17 13:08:08

标签: java synchronized notify

我是线程编程的新手,我有如下困惑。让我们看下面的代码块。

synchronized(obj)
{
   //do operations
   //obj.notify();
   //post operations
   // last statement 
}

现在直到“最后一条语句”执行完毕,即使调用notify()后,obj的监视器也不会释放。所以值得在这里调用notify()吗?因为无论如何当同步块退出时,它不等于调用notify()。

3 个答案:

答案 0 :(得分:1)

否,当您退出同步块时,既不会调用notify()也不会调用notifyAll(),并且所有正在等待同一锁调用wait()的其他线程都不会被唤醒。

关于自动致电notifyAll()的一些弊端 Automatic notify()/notifyAll() on leaving a synchronized block

答案 1 :(得分:0)

synchronized块退出时,notify(如果未调用)。它只会让试图进入synchronized块的最终其他线程继续执行。
notify唤醒被调用wait方法挂起的单个线程。

答案 2 :(得分:0)

同步块将确保在任何时候仅一个线程可以进入该关键部分。在对象上调用notify()将唤醒正在该对象的监视器上等待的单个线程,即obj.wait()。

在大多数情况下,包括上面的示例,您不需要使用wait(),notify()或notifyAll()。

我建议您也查看一下Java中的Executor软件包,该软件包可以处理您的许多复杂性。涉及线程时,很容易引起各种问题。