volatile
- 通过“内存屏障”防止指令重排序,编译器生成字节码时,会在指令序列前后插入内存屏障来禁止特定序列的解释器重排序。
下面是基于保守策略的JMM内存屏障插入策略:
在每个volatile写操作的前面插入一个StoreStore屏障。
在每个volatile写操作的后面插入一个StoreLoad屏障。
在每个volatile读操作的后面插入一个LoadLoad屏障。
在每个volatile读操作的后面插入一个LoadStore屏障。
——保证有序性 - 通过lock前缀(汇编指令上可相当于内存屏障)强制将对缓存的修改操作立即写入主存,利用缓存一致性机制,并且缓存一致性机制会阻止同时修改由两个以上CPU缓存的内存区域数据。
如果是写操作,它会导致其他CPU中对应的缓存行无效。
并且各个线程处理器使用嗅探技术保证它的内部缓存、系统内存和其他处理器的缓存的数据在总线上保持一致。
——保证可见性 - volatile修饰的变量在读操作与写操作之间时可以被中断的(即非连续的),多线程操作时,在某个线程对其进行读写操作时,另外的线程可以加入对其进行操作。
——无法保证原子性
可以配合Atomic包的类进行配合,保证其原子性