#### 增加volatile 使用JIT优化的时候 禁止出现语句重排
#### volatile是Java虚拟机提供的轻量级同步机制。
- 保证可见性
- 不保证原子性(整体流程成功 整体流程失败)如果要保证原子性-加 `synchronized` 或者直接使用 `Automic` 原子类
- 禁止指令重排(保证有序性)
### Volatile内存屏蔽—防止指令重排
计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排,一般分为以下 3 种:
#### 原理:
volatile 可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在 JVM 底层是基于内存屏障实现的。
- 当对非 volatile 变量进行读写的时候,每个线程先从内存拷贝变量到 CPU 缓存中。如果计算机有多个CPU,每个线程可能在不同的 CPU 上被处理,这意味着每个线程可以拷贝到不同的 CPU cache 中。
- 而声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步,所以就不会有可见性问题。
- 对 volatile 变量进行写操作时,会在写操作后加一条 store 屏障指令,将工作内存中的共享变量刷新回主内存;
- 对 volatile 变量进行读操作时,会在写操作后加一条 load 屏障指令&