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

相关推荐
Billow_lamb7 分钟前
Spring Boot2.x.x 全局错误处理
java·spring boot·后端
编程火箭车11 分钟前
【Java SE 基础学习打卡】14 Java 注释
java·编程规范·代码注释·api文档·代码可读性·javadoc·文档注释
雁于飞19 分钟前
分布式基础
java·spring boot·分布式·spring·wpf·cloud native
q***25135 分钟前
java进阶1——JVM
java·开发语言·jvm
zlpzlpzyd36 分钟前
jvm 偏向锁禁用以及移除
jvm
while(1){yan}36 分钟前
线程的状态
java·开发语言·jvm
豐儀麟阁贵39 分钟前
8.3 Java常见的异常类
java·开发语言
20岁30年经验的码农39 分钟前
Java JVM 技术详解
java·jvm·压力测试
1***815341 分钟前
C在游戏中的场景管理
java·jvm·游戏
上78将42 分钟前
jvm的基本结构
jvm