我是否理解构造函数的结尾不是发生 - 在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
}
答案 0 :(得分:3)
如果val
被标记为final
(这也会阻止后续分配到null
),则无法进行NPE:
public final MyClass val = new MyClass();
否则,是的,您的代码很脆弱。
答案 1 :(得分:3)
如果是
val.object.hashCode();
然后有可能出现NPE,因为虽然线程B可能看到val = loc
,但由于Java弱内存模型允许的不同内核等的缓存行为,它可能还没有看到object = new Object();
出于性能原因。
我不认为您的原始代码可以抛出NPE,因为如果val不为null,则hashCode
将执行。
if(val != null) {
val.hashCode(); // IMO could throw NPE
}