JUC之volatile关键字

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屏障

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值