java - 在 while 循环中检查 wait() 的什么条件?

标签 java multithreading

我正在学习Java多线程编程,最难的部分似乎是线程间通信,使用wait()notify()notifyAll()

我引用了 wait() 的官方 Javadoc,转载于此:

 synchronized (obj) {
     while (<condition does not hold>)
         obj.wait();
     ... // Perform action appropriate to condition
 }

我明白了,当线程 t 调用 wait() 时,它会立即释放锁然后等待;但是我无法理解 while loop 中的条件是什么意思?在线程 t 检查 while 循环 中的条件之前,是否有机会检查条件是否已被其他线程修改?

谁能告诉我这个条件是什么,以及在while 循环中使用哪些基本的东西来检查条件?

最佳答案

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

例如,你正在等待某事:

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

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

theObjectYouAreWaitingOn.notifyAll(); 如果邪恶的线程没有/不能干扰 carryOn,你就继续等待合适的客户端。

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

为了您的清晰度,也请检查下面的一项。

wait 和 notify 用于实现[条件变量]( http://en.wikipedia.org/wiki/Monitor_(synchronization)#Blocking_condition_variables ),因此您需要在继续之前检查您正在等待的特定谓词是否为真。

关于java - 在 while 循环中检查 wait() 的什么条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48744746/

相关文章:

java - 从文件创建邻接表

java - 设计模式: many objects of same type with multiple objects of other type

java - 关于访问者模式的问题(Java 示例)

java - 为什么 toMap 的错误放置会导致 RXJava 出现问题?

Java Mongodb 连接失败

Java线程中断仅等待、加入和 sleep

c# - 将 block 与线程一起使用

java - 使用 Simplexml 生成 java 类

java - 为什么这个 boolean 比较不能正常工作?

objective-c - UITableview 在 reloadData 调用时抛出 "invalid number of rows"错误,但仅适用于 iPad 1 而不是 iPad 2