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



我是线程编程的新手,我有一个像下面这样的困惑。让我们采用以下代码块。

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

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

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

以下是有关自动呼叫notifyAll()的一些缺点 自动通知((/通知全部(( 离开同步块

synchronized块退出时,如果未调用,则notify。它只允许尝试进入synchronized块的最终其他线程进行处理。
notify唤醒由调用wait方法挂起的单个线程。

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

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

我建议您也看看 Java 中的 Executor 包,它处理了您的大部分复杂性。 在线程方面很容易引起各种问题。

最新更新