读书人

授命重排

发布时间: 2013-04-02 12:35:26 作者: rapoo

指令重排

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、关于该对象的读写操作,请不要重排。



读书人网 >编程

热点推荐