首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

授命重排

2013-04-02 
指令重排http://kenwublog.com/illustrate-memory-reordering-in-cpuhttp://www.cnblogs.com/flier/archiv

指令重排

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



热点排行