2

我想知道是否可以在不使用 notify() 的情况下在同步的代码上使用 wait(),如下所示:

wait_on(B):
    synchronized(B.monitor) {
    B.count--
        while (B.count > 0) { /* wait */ }
    }

提前致谢

4

4 回答 4

5

您需要 notify 或 notifyAll 将线程从等待状态中唤醒。在您的示例中,代码将进入等待并留在那里(除非被中断)。

了解wait、yield和sleep之间的区别。需要在同步块中调用等待,一旦进入等待,锁就会被释放,并且线程保持在该状态直到调用通知。Yield 将线程返回到就绪池,并让调度程序决定何时再次运行它。睡眠意味着线程休眠一段固定的时间(然后从那里进入就绪池)。

确保在要同步的同一对象上调用 wait(这里是 B.monitor)。

于 2012-04-19T18:38:58.727 回答
0

不!唯一的选择是等待超时,这肯定对您没有帮助。

于 2012-04-19T18:40:22.847 回答
0

如果你把 the/* wait */改成对 的调用wait(),而没有人会调用notify()or notifyAll(),那么这个线程将永远不会醒来......

于 2012-04-19T18:40:55.047 回答
0

如果这是您想要的障碍,您将需要通知所有其他线程:

wait_on(B) {
    synchronized(B.monitor) {
        B.count--
        while (B.count > 0) {
            B.monitor.wait()
        }
        B.monitor.notifyAll();
    }
}

问候,

皮埃尔-吕克

于 2012-05-04T00:06:07.083 回答