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 == null
或obj != null && obj.counter == null
或 obj != null && obj.counter != null
).
给定以下代码:
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 == null
或obj != null && obj.counter == null
或obj != null && obj.counter != null
).