为什么c的计算语句不会重排么, 这是因为单线程情况下, 指令重排要遵守As-If-Serial语义, 编译器和处理器不会对存在数据依赖关系的操作做重排....(3) 如果A是对volatile变量的写操作, B是对同一个变量的读操作, 那么A happens-before B.
(4) 线程的启动 happens-before 该线程上的其他动作....先看一个JAVA下对象的实例化语句, 在不遵守happens-before原则时, 会出现什么问题:
obj=new Object();
该语句在执行过程中会分为三个步骤:
1. 分配内存;
2....StoreStore屏障和StoreLoad屏障
instance = new Singleton();
StoreStore屏障保证了单例对象先实例化,再将地址赋值给instance;
其他屏障功能在这个例子不明显...,可以想象下在需要许多其他变量的情况进行初始化操作, volatile是如何让代码能按我们预期执行的.