为什么总是在循环内调用 wait()

新手上路,请多包涵

我读到我们应该总是在循环中调用 wait()

 while (!condition) { obj.wait(); }

它没有循环也能正常工作,那是为什么呢?

原文由 Geek 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 331
1 个回答

您不仅需要循环它,还需要检查循环中的条件。 Java 不保证您的线程只会被 notify()/notifyAll() 调用或正确的 notify()/notifyAll() 调用唤醒。由于此属性,无循环版本可能会在您的开发环境中运行,但在生产环境中会意外失败。

例如,您正在等待某事:

 synchronized (theObjectYouAreWaitingOn) {
   while (!carryOn) {
      theObjectYouAreWaitingOn.wait();
   }
}

一个邪恶的线程出现并且:

 theObjectYouAreWaitingOn.notifyAll();

如果邪恶的线程没有/不能 carryOn 你就继续等待合适的客户端。

编辑: 添加了更多示例。等待可以被中断。它抛出 InterruptedException,您可能需要将等待包装在 try-catch 中。根据您的业务需要,您可以退出或抑制异常并继续等待。

原文由 akarnokd 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题