同步块与wait / notify之间的差异,没有它们?
如果我只使用synchronized,而不是wait / notify方法,它是否仍然保持线程安全?
有什么不同 ?
Thx提前。
使用synchronized
可以一次只在线程上访问方法/块。 所以,是的,它是线程安全的。
这两个概念相结合,不是相互排斥的。 当您使用wait()
您需要拥有该对象上的监视器。 所以你需要在它之前synchronized(..)
。 使用.wait()
使当前线程停止,直到另一个线程在它等待的对象上调用.notify()
。 这是对synchronized
的补充,它只确保只有一个线程将进入块/方法。
所以在面对这个问题的面试问题时感到尴尬后,我决定再次查找并理解10亿次。
同步块使得代码线程安全。 毫无疑问。 当wait()和notify()或notifyAll()进来时,就是你试图编写更高效代码的地方。 例如,如果你有一个多线程共享的项目列表,那么如果你把它放在一个监视器的同步块中,那么线程线程将不断跳转,并在上下文切换期间来回运行代码。 。甚至有一个空的列表!
wait()因此在监视器(synchronized(..)中的对象)上用作一种机制来告诉所有线程冷静并停止使用cpu周期,直到进一步通知或notifyAll()为止。
所以像这样:
synchronized(monitor) {
if( list.isEmpty() )
monitor.wait();
}
...somewhere else...
synchronized(monitor){
list.add(stuff);
monitor.notifyAll();
}
有效的Java项目69:“鉴于正确使用wait和notify的困难,您应该使用更高级别的并发实用程序。”
避免使用wait()和notify():尽可能使用synchronized
或java.util.concurrent中的其他实用程序。
上一篇: Difference between Synchronized block with wait/notify and without them?