Object.wait() 必须驻留在同步块中以保证线程安全并防止 IllegalMonitorStateException。
等待释放关联的监视器与该对象,允许其他线程获取它。如果 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(); } }
在此示例中:
此同步问题普遍适用于等待/通知机制,无论具体实现如何。如果没有同步,总是存在竞争条件和不可预测的线程行为的风险。因此,“在同步中等待”规则可以确保线程安全并防止此类问题。
以上是为什么必须始终在同步块内调用 Object.wait()?的详细内容。更多信息请关注PHP中文网其他相关文章!