在 Java 中,构造函数的结束不是发生在关系之前,我的理解是否正确?下面的线程 A 和 B 未同步的代码是否可能以某种方式抛出 NullPointerException?
// Shared reference declaration
public MyClass val;
// Class declaration
public class MyClass {
public Object object;
public MyClass() {
object = new Object();
}
}
// Using in thread A
MyClass loc = new MyClass();
val = loc;
// Using in thread B
if(val != null) {
val.object.hashCode(); // IMO could throw NPE
}
最佳答案
如果是
val.object.hashCode();
那么就有可能出现 NPE,因为虽然线程 B 可能看到 val = loc
但由于缓存,它可能还没有看到 object = new Object();
出于性能原因,Java 的弱内存模型允许在不同内核等上的行为。
我认为您的原始代码不会抛出 NPE,因为如果 val 不为空,则 hashCode
将执行。
if(val != null) {
val.hashCode(); // IMO could throw NPE
}
关于java - 构造函数的结尾恰好 - 在 Java 中的关系之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24116468/