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

相关推荐
蜂蜜黄油呀土豆17 小时前
Redis 底层实现深度解析:从 ListPack 到哈希表扩容
数据结构·redis·zset·sds·listpack·哈希表扩容
cike_y17 小时前
Spring-Bean的作用域&Bean的自动装配
java·开发语言·数据库·spring
斯普信云原生组18 小时前
Redis 阈值超限及影响分析
redis·spring·bootstrap
qq_124987075318 小时前
基于深度学习的蘑菇种类识别系统的设计与实现(源码+论文+部署+安装)
java·大数据·人工智能·深度学习·cnn·cnn算法
谈笑也风生18 小时前
经典算法题型之排序算法(三)
java·算法·排序算法
自己的九又四分之三站台18 小时前
导入数据到OG GraphQL以及创建graph
java·后端·graphql
强子感冒了19 小时前
Java学习笔记:String、StringBuilder与StringBuffer
java·开发语言·笔记·学习
程序员JerrySUN19 小时前
OP-TEE + YOLOv8:从“加密权重”到“内存中解密并推理”的完整实战记录
android·java·开发语言·redis·yolo·架构
+VX:Fegn089519 小时前
计算机毕业设计|基于springboot + vueOA工程项目管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
JasmineWr19 小时前
Spring事务解析
java·spring