如果我有以下代码:
public void foo() {
Executors.newSingleThreadedExecutor().submit(
new Runnable() {
int x = 5;
public void run() {
System.out.println("x = " + x);
}
}
);
}
我保证会看到" x = 5",或者我也能看到" x = 0"因为println
正在另一个可能看到x
未初始化值的线程中执行?我从来没有目睹过这种情况,但我一直无法保证这不会发生(例如,如果x
是final
,那么似乎它永远不会发生。)
答案 0 :(得分:5)
最新的JMM中定义了许多"happens before" relationships。其中一个点是“启动一个线程”并提交给执行程序,它与启动一个线程有相同的保证(参见javadocs中的"memory consistency effects")。