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

时间:2012-04-19 18:36:50

标签: java multithreading synchronization wait synchronized

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

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

提前致谢

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

没有!唯一的选择是等待超时,这肯定无法帮助你。

答案 2 :(得分:0)

如果您将/* wait */更改为wait()的来电,并且没有人会拨打notify()notifyAll(),那么此线程将永远不会被唤醒... < / p>

答案 3 :(得分:0)

如果它是您想要的屏障,您需要通知所有其他线程:

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

此致

皮尔吕克