源代码->编译器优化的重排->指令并行也可能重排->内存系统也会重排->执行
处理器在进行指令重排的时候,考虑:数据之间的依赖性
int x = 1; //1
int y = 2; //2
x = x + 3; //3
y = x * x; //4
我们期望的顺序:1234,但可能是2134,1324
volatile可以避免指令重排
volatile可以保证可见性,但不能保证原子性,由于内存屏障,可以保证避免指令重排的现象产生!