给出以下代码:
class MyObj{
AtomicLong counter;
public MyObj(){
count = new AtomicLong();
}
}
MyObj obj = new MyObj();
// start a few threads that referencey obj and access counter
我想知道这里是否存在潜在的情况,由于编译器重新排序/内联,创建的线程将看到MyObj的状态为不完整?例如,他们可能会看到counter = null
或部分创建的计数器,因为它不是最终字段?
答案 0 :(得分:4)
有两种情况:
MyObj obj = new MyObj()
之后启动线程 ,则会发生一个先发生关系,以保证线程都能看到正确构造的对象obj == null
或obj != null && obj.counter == null
或{{1} })。