指令重排
http://kenwublog.com/illustrate-memory-reordering-in-cpu
http://www.cnblogs.com/flier/archive/2004/07/08/22353.html
多线程问题中,
一个是说内存变量和cpu cache之间数据不同步,导致线程之间读写不可见。
一个是说java代码在编译和运行期会有读写顺序重排。
例如:
public static A a;
private A() {
if(a == null) {
synchronized(this) {
if (a == null) a = new A();
}
}
return a;
}
在编译重排后,a可能首先执行一个新A对象的指针,此时A对象尚未执行contructor,内部变量都是默认的。然后才执行 new A()操作。
如果在a被赋予一个未初始化的A对象地址后,另外一个线程获得了a指针,并执行,结果就是报错。
以上两个问题,都可以通过voilate关键字,告诉执行器: 1、该字段用完马上写回主内存,不要在cpu cache停留 2、关于该对象的读写操作,请不要重排。