可见性:
volatile的功能就是被修饰的变量在被修改后可以立即同步到主内存,被修饰的变量在每次是用之前都从主内存刷新。本质也是通过内存屏障来实现可见性
写内存屏障(Store Memory Barrier)可以促使处理器将当前store buffer(存储缓存)的值写回主存
读内存屏障(Load Memory Barrier)可以促使处理器处理invalidate queue(失效队列)。进而避免由于Store Buffer和Invalidate Queue的非实时性带来的问题。
禁止指令重排序:
volatile是通过内存屏障来禁止指令重排序
JMM内存屏障的策略
在每个 volatile 写操作的前面插入一个 StoreStore 屏障
在每个 volatile 写操作的后面插入一个 StoreLoad 屏障
在每个 volatile 读操作的后面插入一个 LoadLoad 屏障
在每个 volatile 读操作的后面插入一个 LoadStore 屏障
8种情况禁止重排序(happens-before)
缓存行对齐
缓存行64个字节是CPU同步的基本单位,缓存行隔离会比伪共享效率要高 应用 Disruptor
系统底层如何实现数据一致性
1. MESI如果能解决,就使用MESI
2. 如果不能,就锁总线
系统底层如何保证有序性
1. 内存屏障sfence mfence lfence等系统原语
2. 锁总线
volatile如何解决指令重排序
1: volatile i
2: ACC_VOLATILE
3: JVM的内存屏障 屏障两边的指令不可以重排!保障有序!
4:hotspot实现 bytecodeinterpreter.cpp