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

Calling notify() vs ending synchronized block Java

我是线程编程的新手,我对 below.Let 的代码块感到困惑。

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

现在直到"last statement"执行,即使调用notify()也不会释放obj的监视器。那么值得在这里调用 notify() 吗?因为反正synchronized块退出的时候,不就等于调用了notify()。

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

以下是关于自动调用 notifyAll() 的一些缺点 Automatic notify()/notifyAll() on leaving a synchronized block

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

synchronized 块将确保在任何时候只有一个线程可以在该临界区中。在对象上调用 notify() 将唤醒正在等待该对象监视器的单个线程,即 obj.wait().

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

我建议您也看看 Java 中的 Executor 包,它可以处理您的大部分复杂问题。做线程很容易出各种问题