java - while(condition) { Object.wait() } 成语

标签 java multithreading

我知道,我们使用这个习惯用法来等待通知来处理虚假唤醒:

synchronized (obj) {
    while(somecond)
        obj.wait();
}

如果出现虚假唤醒,我们将检查状态并返回等待。

但是,考虑一下这种情况:

  1. 我们开始等待,然后 obj.wait() 释放对 obj 的锁定。
  2. 操作系统虚假通知等待线程
  3. 我们返回检查条件(由于等待释放了 obj 锁)
  4. obj.notify() 在那一刻被调用。

是的,条件检查非常快,我们可以进行条件检查而不是在 obj.wait() 中的机会很小,可以忽略不计。在那种情况下,我们可以松开 obj.notify() 调用。

我是不是误解了什么,或者我们真的可以使用这种模式来取消通知?

最佳答案

另一个线程需要锁定 obj 才能调用 obj.notify()。如果您的线程处于 while 循环中而不等待,它就无法拥有它,因为您的线程还需要锁定 obj 才能处于 while 循环中。

关于java - while(condition) { Object.wait() } 成语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21721401/

相关文章:

ruby - 多线程 ruby​​ 程序只使用 100% cpu

c# - 使用 Task.Run 旋转的线程总是以退出代码 259 退出

java - 当一个线程在尝试获取锁后被挂起时,是否总是有上下文切换?

java - 从子元素创建 XPath

java - Confluence 中的 <property name ="hibernate.setup">true</property> 有何作用?

java - 如何解析命名空间文件位置

java - 在 Java 中使用双重检查锁定单例扩展类

java - 如何在另一个进程开始之前绘制jrame组件

c# - 替代具有保证交付的 Dataflow BroadcastBlock

java - Wildfly 10 内存泄漏问题