构造函数的结束发生 - 在Java中的关系之前

时间:2014-06-09 08:33:06

标签: java multithreading

我是否理解构造函数的结尾不是发生 - 在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
}

2 个答案:

答案 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
}