【发布时间】:2018-10-17 13:08:07
【问题描述】:
我是线程编程的新手,我有如下的困惑。让我们看看下面的代码块。
synchronized(obj)
{
//do operations
//obj.notify();
//post operations
// last statement
}
在“最后一条语句”执行之前,即使调用了 notify(),obj 的监视器也不会被释放。那么值得在这里调用 notify() 吗?因为反正当同步块退出时,不等于调用notify()。
【问题讨论】:
-
您是在问一般的
notify(恰好是wait的对应物,不是同步块),还是在这样的块中间调用它? -
我的建议是永远忘记
notify()。在这一点上,它是一个仅供专家使用的低级工具;如果你想构建依赖于状态的类,你应该在java.util.concurrent中构建顶级类,比如Semaphore,如果你不需要状态依赖,你肯定不需要notify()。 -
@GhostCat,我认为这个问题更像是 stackoverflow.com/questions/15886972/… 的重复问题,然后是你引用的问题
-
@tevemadar,是的,当代码块已经同步时,它带来了对对象调用通知的额外优势。
-
使用
wait()/notify()来sequence 由多个线程执行的操作(例如,如果您想确保“消费者”线程不会尝试占用从容器中取出的东西,直到在“生产者”将其放入容器中。)但是,如果您只关心 A 和 B 不会同时发生——如果你不在乎哪个先发生——那么你只需要synchronized。
标签: java synchronized notify