我是线程编程的新手,我有如下困惑。让我们看下面的代码块。
synchronized(obj)
{
//do operations
//obj.notify();
//post operations
// last statement
}
现在直到“最后一条语句”执行完毕,即使调用notify()后,obj的监视器也不会释放。所以值得在这里调用notify()吗?因为无论如何当同步块退出时,它不等于调用notify()。
答案 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软件包,该软件包可以处理您的许多复杂性。涉及线程时,很容易引起各种问题。