volatile基本可以做到两件事:
在有缓存的情况下会遇到一致性问题,这个关键字他能确保我们对于这个变量的读取和写入,都一定会同步到主存里让Cache数据和主存数据保持一致。
(1) 阻止编译器为了提高速度将一个变量缓存到寄存器内不写回
(2) 阻止编译器调整操作volatile变量的指令顺序(即语句顺序)
(3)过度的指令优化
volatile 的使用:
① 编译器很聪明,会帮我们做些优化, 比如:
int a;
a = 0; // 这句话可以优化掉,不影响 a 的结果
a = 1;
② 有时候编译器会自作聪明,比如:
int *p = ior