调用 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 包,它可以处理您的大部分复杂问题。做线程很容易出各种问题
我是线程编程的新手,我对 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 包,它可以处理您的大部分复杂问题。做线程很容易出各种问题