Java - 对象创建和可见性

Java - object creation and visibility

给定以下代码:

class MyObj{
   AtomicLong counter;

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

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

我想知道这里是否存在潜在的情况,即由于编译器 reodering/inlining,创建的线程会将 MyObj 的状态视为不完整?例如,他们可能会看到 counter = null,或者计数器部分创建,因为它不是最终字段?

有两种情况:

  • 如果您在 after MyObj obj = new MyObj() 之后启动线程,则有一个 happens-before 关系保证线程将所有人都看到正确构造的对象
  • 如果您在之前启动线程,则无法保证任何事情(他们可以观察到obj == nullobj != null && obj.counter == nullobj != null && obj.counter != null).