我们先看下面一个Java并发编程下变量可见行示例
public class RaceCondition {
private static boolean done;
public static void main(final String[] args) throws InterruptedException {
new Thread(new Runnable() {
public void run() {
int i = 0;
while (!done) {
i++;
}
System.out.println("Done!");
}
}).start();
System.out.println("OS: " + System.getProperty("os.name"));
Thread.sleep(2000);
done = true;
System.out.println("flag done set to true");
}
在Ubutun双核cpu下,默认不加任何jvm参数执行
输出如下: 主线程执行完之后,子线程一直在执行,为什么子线程没有获取到主线程修改done之后的变量值呢?
我们再设置下jvm的参数为 -client,则子线程能够获取主线程修改done之后的值,正常执行完