Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么必须从同步块/方法调用wait和notify?_Java_Multithreading_Concurrency_Wait_Notify - Fatal编程技术网

Java 为什么必须从同步块/方法调用wait和notify?

Java 为什么必须从同步块/方法调用wait和notify?,java,multithreading,concurrency,wait,notify,Java,Multithreading,Concurrency,Wait,Notify,我正在读的书中说: 这项技术是必要的,因为比赛条件,否则将 存在于设置和发送通知以及测试和 收到通知。如果wait()和notify()机制 如果在持有同步锁时未调用,则不会 确保收到通知的方式 我不明白这到底意味着什么,为什么比赛条件会发生 编辑:嗯,我现在明白了,这可能是一个重复的问题 ,但答案集中在进行条件检查和同步等待上 shrini1000的反例: 我仍然可以这样做: while(!condition){synchronized(this){wait();}} 这意味着在检查状况和等待

我正在读的书中说:

这项技术是必要的,因为比赛条件,否则将 存在于设置和发送通知以及测试和 收到通知。如果wait()和notify()机制 如果在持有同步锁时未调用,则不会 确保收到通知的方式

我不明白这到底意味着什么,为什么比赛条件会发生

编辑:嗯,我现在明白了,这可能是一个重复的问题 ,但答案集中在进行条件检查和同步等待上

shrini1000的反例:

我仍然可以这样做:
while(!condition){synchronized(this){wait();}}

这意味着在检查状况和等待之间仍然存在着竞争 如果在同步块中正确调用wait()。也有 这一限制背后还有其他原因吗,也许是因为它的运作方式 用Java实现


某些东西可能被误用的事实绝非反例

Java只强制执行
wait()
notify()
是同步块的一部分(因为这是它们应该被使用的唯一方式),但是块边界的定义取决于您


作为反例,考虑
finally
块。Java只强制它在
try
块之后出现,但您是唯一应该知道该
try
块应该包含什么的人;您甚至可以将其留空(这将错过
最终的关键点)。

它必须是关于作者在您复制相关文章之前必须介绍的技术。我不确定你在读哪本书,但我会尽力回答这个问题

我读过一本类似的书《用Java思考》,书中谈到了同样的种族条件。它建议使用wait和notify可以防止这种情况,这样代码就不会错过notify信号

使用notify()/wait()或notifyAll协调两个线程时( )/等待(),可能会错过信号。假设T1是一个 通知T2,并且这两个线程是使用 以下(有缺陷的)方法:

T1:

(T2的设置条件)是防止T2调用wait()的操作,如果它还没有调用wait()

解决方案是防止在someCondition变量上出现争用条件。以下是T2的正确方法:

synchronized(sharedMonitor) {
    while(someCondition) {
        sharedMonitor.wait();
    }
}


我认为答案不存在,因为我的问题中有反例。这里没有反例。您的wait()调用位于同步块中。根本原因是内存模型的工作方式-您可以看一下:有关等待集如何工作的详细说明。还没有确切找到我要查找的内容,但对于link+1,某些内容可能被误用这一事实很难作为反例。是的,读了一会儿之后,我想这本书的作者是指这个案子。这是“Java线程,第三版”。O'Reilly,我不推荐。希望我已经回答了你的问题。好的,你可以用java来思考(只需阅读并发一章就足够了),对于更多细节,jcip是最好的。是的,我想你回答了作者的意图,但这并不是我的问题。无论如何,我的问题并不重要。关于jcip,我有这本书,我会在读了这本书之后再读。我会给你投票,但不是分数,因为这;)
while(someCondition) {
    // Assume that T2 evaluates someCondition and finds 
    // it true, now when program goes to next line thread
    // scheduler switches to T1 and executes notify again
    // after when control comes to T2 it blindly executes
    // wait(), but it has already missed notify so it will
    // always be waiting.

    .... some code ....

    synchronized(sharedMonitor) {
        sharedMonitor.wait();
    }
}
synchronized(sharedMonitor) {
    while(someCondition) {
        sharedMonitor.wait();
    }
}