首页 >Java >java教程 >为什么必须始终在同步块内调用 Object.wait()?

为什么必须始终在同步块内调用 Object.wait()?

DDD
DDD原创
2024-12-14 09:25:12435浏览

Why Must Object.wait() Always Be Called Within a Synchronized Block?

Wait() 必要的同步以确保可预测性

Object.wait() 必须驻留在同步块中以保证线程安全并防止 IllegalMonitorStateException。

同步要求的原因

等待释放关联的监视器与该对象,允许其他线程获取它。如果 wait() 可以在同步块之外调用,则可能会出现不可预测的行为。

没有同步的 Wait() 的潜在危险

考虑没有同步 wait() 的阻塞队列实现:

class BlockingQueue {
    Queue<String> buffer = new LinkedList<>();

    public void give(String data) {
        buffer.add(data);
        notify(); // Signal waiting consumer
    }

    public String take() throws InterruptedException {
        while (buffer.isEmpty()) {
            wait(); // Suspend thread without synchronization
        }
        return buffer.remove();
    }
}

在此示例中:

  1. 消费者线程可以调用take(),检查缓冲区是否为空,然后在不同步的情况下调用 wait()。
  2. 在消费者线程实际休眠之前,生产者线程可能会向缓冲区添加一个元素并通知等待线程。
  3. 但是,消费者线程可能由于缺乏同步而错过了通知。
  4. 生产者线程可能永远不会随后通知消费者,从而导致死锁。

通用同步问题

此同步问题普遍适用于等待/通知机制,无论具体实现如何。如果没有同步,总是存在竞争条件和不可预测的线程行为的风险。因此,“在同步中等待”规则可以确保线程安全并防止此类问题。

以上是为什么必须始终在同步块内调用 Object.wait()?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn