java中编写的代码,不一定会顺序执行
例如在三段行看似“无关联”代码。
//假设为静态变量 static int a=0; static boolean b=false; //赋值 a=2; b=true; // 这是一个看似无关联代码(另一个线程) if(b){ System.out.println(a+a); }
关于a,b的使用,肯定在声明之后,因为有明确的依赖性。
而a,b的再次使用之间则没有明确关联。
假如执行a,b赋值后立刻执行if,那么得到的输出是4
假设执行的是b赋值然后if,那么得到输出0。(正常情况下,b为true就是4)
由此可以看到java指令重排序带来了一些灾难。
如果使用volatile修饰变量,则有以下效果:
1. volatile写之前的操作不会被重排序到volatile写之后。
2. volatile读之后的操作不会被重排序到volatile读之前。
3. 前边是volatile写,后边是volatile读,这两个操作不能重排序。