gpt4 book ai didi

java - 为什么 Java 编译器不跟踪对象监视器是否正确处理

转载 作者:行者123 更新时间:2023-11-30 06:39:55 27 4
gpt4 key购买 nike

在下面的代码片段中

synchronized(myMonitorObject)
try{
myMonitorObject.wait();
} catch(InterruptedException e){...}
}

如果省略第一行,为什么编译器不会反对而是抛出 IllegalMonitorStateException?

最佳答案

考虑以下示例:

public void m1(Object lock) throws InterruptedException {
lock.wait();
}

这应该是一个编译错误吗?

现在考虑一下:

public void m2() throws InterruptedException {
Object lock = new Object();
synchronized (lock) {
m1(lock);
}
}

m1仍然应该是编译错误吗?

使 m1 成为编译错误(正如您似乎所建议的那样)的问题是它所做的不一定是错误的。事实上,编译器不可能在不保守的情况下可靠地区分正确与错误。类比是:

  • 编译器不会将触发 NPE 的代码视为编译错误。
  • 编译器确实将使用未初始化的局部变量视为错误。然而,Java 严格的明确赋值规则意味着某些情况下变量实际被初始化会被视为错误。

关于java - 为什么 Java 编译器不跟踪对象监视器是否正确处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44546394/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com