带等待/通知和没有它们的同步块之间的区别?

如果我只使用 ,而不是 / 方法,它是否仍然是线程安全的?synchronizedwaitnotify

有什么区别?


答案 1

使用使方法/块一次只能在线程上访问。所以,是的,它是线程安全的。synchronized

这两个概念是结合的,而不是相互排斥的。使用时,您需要拥有该对象上的监视器。所以你需要在那之前有它。使用会使当前线程停止,直到另一个线程调用它等待的对象。这是对 的补充,它只是确保只有一个线程将进入块/方法。wait()synchronized(..).wait().notify()synchronized


答案 2

因此,在一次关于这个问题的面试中感到尴尬之后,我决定查一下,再理解它10亿次。

synchronized块使代码线程安全。毫无疑问。何时和/或进来是您尝试编写更有效代码的地方。例如,如果您有一个多个线程共享的项目列表,那么如果您将其放在监视器的块中,那么线程线程将不断跳入并来回运行代码,在上下文切换期间来回运行......即使有一个空列表!wait()notify()notifyAll()synchronized

因此,wait() 在监视器(同步(..)内部的对象)上使用,作为一种机制,告诉所有线程冷却并停止使用 CPU 周期,直到另行通知或 notifyAll()。

所以像这样:

synchronized(monitor) {
    if( list.isEmpty() )
        monitor.wait();
}

...别处。。。

synchronized(monitor){
    list.add(stuff);
    monitor.notifyAll();
}