Volatile
被volatile 修饰的变量有两大特点:可见性与有序性
volatile的内存语义
volatile凭什么可以保证可见性和有序性???内存屏障 Memory Barrier
内存屏障
四大屏障
Volatile保证可见性、没有原子性,指令禁重排。
保证可见性:保证不同线程对某个变量完成操作后结果及时可见,即该共享变量一旦改变所有线程立即可见。
volatile不保证原子性
volatile变量不适合参与到依赖当前值的运算
重排序
volatile写操纵,在volatile变量之前与之后加了两种类型的内存屏障的代码含义演示,禁止指令重排
volatile读之后的操作,都禁止重排序待volatile之前
volatile的使用场景
1.单一赋值2.状态标志3.开销较低的读、写锁策略4.双重锁校验
状态标志位使用场景演示
开销较低的读、写锁策略
双重锁校验
解决隐患思路:利用volatile,禁止"初始化对象(2)"和"设置singleton指向内存空间(3)"的重排序
volatile总结
可见性
有序性(禁止指令重排)
写指令
读指令
字节码层面
内存屏障是什么?
内存屏障: 是一种屏障指令,它使得CPU或者编译器对屏障指令的前和后所发出的内存操作,执行一个排序的约束 。也叫内存栅栏或栅栏指令
内存屏障能干嘛
阻止屏障两边的指令重排序,写数据时加入屏障 ,强制将线程私有工作内存的数据刷回主物理内存。读数据时加入屏障 ,线程私有工作内存的数据失效,重新到主物理内存中获取最新数据。
内存屏障的四大指令
1.在每一个volatile写操作前面插入一个StoreStore屏障
2.在每一个volatile写操作后面插入一个StoreLoad屏障
3.在每一个volatile读操作后面插入一个LoadLoad屏障
4.在每一个volatile读操作后面插入一个LoadStore屏障