在同步代码段 (java) 中使用 wait() 而不使用 notify()



我想知道是否可以在不使用 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();
    }
}

问候

皮埃尔-吕克

最新更新