我是线程编程的新手,我有一个像下面这样的困惑。让我们采用以下代码块。
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 包,它处理了您的大部分复杂性。 在线程方面很容易引起各种问题。