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

调用notify()与结束同步块Java,java,synchronized,notify,Java,Synchronized,Notify,我是线程编程新手,我有如下困惑 synchronized(obj) { //do operations //obj.notify(); //post operations // last statement } 现在,在执行“last statement”之前,obj的监视器即使在调用notify()之后也不会被释放。那么在这里调用notify()是否值得呢?。因为不管怎样,当同步块退出时,它不等于调用notify() 否,当您退出同步块时,既不会调用notify()

我是线程编程新手,我有如下困惑

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

现在,在执行“last statement”之前,obj的监视器即使在调用notify()之后也不会被释放。那么在这里调用notify()是否值得呢?。因为不管怎样,当同步块退出时,它不等于调用notify()

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

关于自动调用
notifyAll()

已同步的
块退出时,
如果未调用,则通知
。它只允许尝试进入
synchronized
块的最终另一个线程进行处理。

notify
唤醒调用
wait
方法而挂起的单个线程。

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

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


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

你问的是“代码>通知/代码>一般(这恰好是<代码>等待/代码>,不是同步块),或者是在这个块中间调用它?我的建议是永远忘记<代码>通知()<代码>。在这一点上,它是一个只供专家使用的低级工具;如果您希望构建依赖于状态的类,那么您应该在
java.util.concurrent
中构建类似于
Semaphore
的类,如果您不需要依赖于状态,那么您肯定不需要
notify()
@GhostCat,我认为这个问题与您之前提出的问题相比,更像是一个重复的问题cited@tevemadar,是的,当代码块已经同步时,它对对象调用notify还有什么好处。使用
wait()/notify()
对由多个线程执行的操作进行排序(例如,如果您想确保“使用者”线程在“生产者”之后才尝试从容器中取出某些内容但是,如果你关心的只是A和B不能同时发生——如果你不关心哪一个先发生——那么你所需要的就是同步。