为什么 wait() 必须驻留在同步块中
在同步块中强制调用 Object.wait() 是至关重要的Java 并发模型中的目的。不遵守此限制会导致 IllegalMonitorStateException,但了解此约束背后的基本原理至关重要。
Synchronized Wait() 的原因
wait() 释放与同步对象关联的监视器。在调用 wait() 之前显式获取监视器可确保在发生等待操作时调用线程独占该监视器。这确保了在调用线程等待时没有其他线程可以修改共享状态。
同步块之外的 Wait() 的后果
如果 wait() 可以在同步块之外调用,可能会导致各种问题。考虑以下场景:
示例:阻塞队列
想象一个阻塞队列,允许消费者线程从队列中获取元素,并允许生产者线程添加元素到队列中。没有同步:
潜在问题:
通用同步要求
此同步问题不仅限于阻塞队列示例。任何涉及使用 wait() 和 notification() 进行线程通信的场景都需要同步,以防止竞争条件和潜在的死锁。
Waiter 和 Notifier 之间的协议
同步 wait()确保等待线程(消费)和通知线程(生产)就共享资源(谓词)的状态达成一致。该协议保证服务员在等待之前正确检查谓词,并且在该漏洞期间不会错过任何通知。
在上面的示例中,谓词是 buffer.isEmpty()。同步确保消费者线程仅在缓冲区真正为空时才挂起自己。
以上是为什么必须在 Java 的同步块内调用 wait() ?的详细内容。更多信息请关注PHP中文网其他相关文章!