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

相关推荐
我命由我123458 小时前
Android 开发问题:MlKitException: An internal error occurred during initialization.
android·java·java-ee·android jetpack·android-studio·androidx·android runtime
888CC++9 小时前
java 并发编程
java·开发语言·python
无风听海9 小时前
JSON Web Token(JWT)完全指南
java·前端·json
JAVA社区10 小时前
Java高级全套教程(十一)—— Kubernetes 超详细企业级实战详解
java·运维·微服务·容器·面试·kubernetes
在繁华处11 小时前
Java从零到熟练(九):并发编程基础
java·开发语言
木头程序员11 小时前
SSM框架学习笔记
java·开发语言·mysql·spring·maven
李白你好11 小时前
页面资产梳理 · 技术指纹识别 · Spring 端点探测
java·后端·spring
一起逃去看海吧11 小时前
dify-03
java·linux·开发语言
我是一颗柠檬11 小时前
【Java后端技术亮点】热Key探测与本地缓存二级防护:Redis热点问题的终极解决方案
java·redis·后端·缓存·中间件
Refrain_zc12 小时前
Android 音视频通话核心 —— 音频编码(AAC)完整解析
java