我想知道是否可以在不使用 notify() 的情况下在同步代码段上使用 wait(),如下所示:
wait_on(B):
synchronized(B.monitor) {
B.count--
while (B.count > 0) { /* wait */ }
}
提前致谢
您需要通知或通知全部才能将线程从等待状态唤醒。在您的示例中,代码将输入等待并停留在那里(除非中断)。
了解等待、屈服和睡眠之间的区别。等待需要在同步块中调用,一旦进入等待,锁就会释放,线程将保持该状态,直到调用通知。Yield 将线程返回到就绪池,并让调度程序决定何时再次运行它。睡眠意味着线程在固定的时间段内处于休眠状态(然后从那里进入就绪池)。
确保在要同步的同一对象上调用 wait(这里是 B.monitor)。
不!唯一的选择是等待超时,这肯定对您无济于事。
/* wait */
改为调用wait()
,并且没有人会调用notify()
或notifyAll()
,那么这个线程将永远不会唤醒...
如果它是您想要的障碍,则需要通知所有其他线程:
wait_on(B) {
synchronized(B.monitor) {
B.count--
while (B.count > 0) {
B.monitor.wait()
}
B.monitor.notifyAll();
}
}
问候
皮埃尔-吕克