Java面试题之多线程 为什么你应该在循环中检查等待条件?
在多线程编程中,尤其是在使用条件变量(如 wait()
和 notify()
)时,循环中检查等待条件是一个重要的实践。这是因为在多线程环境中,多个线程可能会同时访问共享资源,导致条件的状态在你调用 wait()
和 notify()
之间发生变化。以下是一些原因,说明为什么在循环中检查等待条件是必要的:
虚假唤醒(Spurious Wakeups):
竞争条件:
保持一致性:
代码的可读性和可维护性:
以下是一个简单的示例,展示了如何在循环中检查条件:
class SharedResource {
private boolean condition = false;
public synchronized void waitForCondition() throws InterruptedException {
while (!condition) {
wait(); // 线程等待,直到被唤醒
}
// 继续执行,条件已满足
}
public synchronized void signalCondition() {
condition = true;
notifyAll(); // 唤醒所有等待的线程
}
}
在这个示例中,waitForCondition
方法使用 while
循环来检查 condition
的状态。如果 condition
为 false
,线程将调用 wait()
进入等待状态。当其他线程调用 signalCondition
方法并将 condition
设置为 true
时,所有等待的线程将被唤醒,但它们仍然需要检查 condition
的状态,以确保它们在继续执行之前满足条件。
在多线程编程中,始终在循环中检查等待条件是一个良好的实践,可以避免潜在的错误和不一致性,确保程序的正确性和稳定性。