【发布时间】:2017-06-16 18:11:23
【问题描述】:
我尝试理解最终字段的语义。
让我们研究代码:
public class App {
final int[] data;
static App instance;
public App() {
this.data = new int[]{1, 0};
this.data[1] = 2;
}
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
instance = new App();
}
}).start();
while (instance == null) {/*NOP*/}
System.out.println(Arrays.toString(instance.data));
}
}
我有一些问题:
- jmm 是否保证 if 应用程序终止然后输出 [1,2] ?
- jmm 是否保证 instance.data 在循环终止后不为空?
P.S.我不知道如何使标题正确,请随意编辑。
附加
如果我们替换是否存在可见性差异:
public App() {
this.data = new int[]{1, 0};
this.data[1] = 2;
}
与
public App() {
int [] data = new int[]{1, 0};
data[1] = 2;
this.data = data;
}
我还想知道 wjat 是否会在我的示例中将 final 替换为 volatile。
因此我想了解有关 4 个新病例的解释
【问题讨论】:
标签: java concurrency visibility final java-memory-model