带等待/通知和没有它们的同步块之间的区别?
2022-09-01 22:52:43
如果我只使用 ,而不是 / 方法,它是否仍然是线程安全的?synchronized
wait
notify
有什么区别?
如果我只使用 ,而不是 / 方法,它是否仍然是线程安全的?synchronized
wait
notify
有什么区别?
使用使方法/块一次只能在线程上访问。所以,是的,它是线程安全的。synchronized
这两个概念是结合的,而不是相互排斥的。使用时,您需要拥有该对象上的监视器。所以你需要在那之前有它。使用会使当前线程停止,直到另一个线程调用它等待的对象。这是对 的补充,它只是确保只有一个线程将进入块/方法。wait()
synchronized(..)
.wait()
.notify()
synchronized
因此,在一次关于这个问题的面试中感到尴尬之后,我决定查一下,再理解它10亿次。
synchronized
块使代码线程安全。毫无疑问。何时和/或进来是您尝试编写更有效代码的地方。例如,如果您有一个多个线程共享的项目列表,那么如果您将其放在监视器的块中,那么线程线程将不断跳入并来回运行代码,在上下文切换期间来回运行......即使有一个空列表!wait()
notify()
notifyAll()
synchronized
因此,wait() 在监视器(同步(..)内部的对象)上使用,作为一种机制,告诉所有线程冷却并停止使用 CPU 周期,直到另行通知或 notifyAll()。
所以像这样:
synchronized(monitor) {
if( list.isEmpty() )
monitor.wait();
}
...别处。。。
synchronized(monitor){
list.add(stuff);
monitor.notifyAll();
}