同步块与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中的其他实用程序。

链接地址: http://www.djcxy.com/p/91863.html

上一篇: Difference between Synchronized block with wait/notify and without them?

下一篇: Threadsafe vs Synchronized