Java - 对象创建和可见性

时间:2017-04-27 22:53:45

标签: java multithreading java-memory-model

给出以下代码:

class MyObj{
   AtomicLong counter;

   public MyObj(){
       count = new AtomicLong();
   }
}

MyObj obj = new MyObj();
// start a few threads that referencey obj and access counter

我想知道这里是否存在潜在的情况,由于编译器重新排序/内联,创建的线程将看到My​​Obj的状态为不完整?例如,他们可能会看到counter = null或部分创建的计数器,因为它不是最终字段?

1 个答案:

答案 0 :(得分:4)

有两种情况:

  • 如果您在 MyObj obj = new MyObj()之后启动线程 ,则会发生一个先发生关系,以保证线程都能看到正确构造的对象
  • 如果您在 之前启动主题 ,则无法保证任何内容(他们可以观察obj == nullobj != null && obj.counter == null或{{1} })。