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

相关推荐
似水明俊德2 分钟前
04-C#.Net-委托和事件-面试题
java·开发语言·面试·c#·.net
m0_7380980223 分钟前
使用Python操作文件和目录(os, pathlib, shutil)
jvm·数据库·python
好家伙VCC25 分钟前
# 发散创新:用 Rust构建高性能游戏日系统,从零实现事件驱动架构 在现代游戏开发中,**性能与可扩展性**是核心命题。传统基于
java·python·游戏·架构·rust
爱笑的源码基地32 分钟前
门诊his系统源码,中西医结合的数字化门诊解决方案
java·spring boot·源码·二次开发·门诊系统·云诊所系统·诊所软件源码
庞轩px33 分钟前
缓存Key设计的“七要七不要”
java·jvm·redis·缓存
小璐资源网33 分钟前
Java 21 新特性实战:虚拟线程详解
java·开发语言·python
SimonKing1 小时前
全网爆火的OpenClaw保姆级教程Linux版,它来了。
java·后端·程序员
2301_819414301 小时前
使用Python进行图像识别:CNN卷积神经网络实战
jvm·数据库·python
于慨1 小时前
tauri
java·服务器·前端
WZTTMoon1 小时前
从互斥锁到无锁,Java 20年并发安全进化史
java·python·安全