大家好,这里是淇妙小屋,一个分享技术,分享生活的博主1. volatile的作用
以下是我的主页,各个主页同步更新优质博客,创作不易,还请大家点波关注
掘金主页
知乎主页
Segmentfault主页
开源中国主页
后续会发布更多MySQL,Redis,并发,JVM,分布式等面试热点知识,以及Java学习路线,面试重点,职业规划,面经等相关博客
转载请标明出处!
1.1 保证变量的可见性 volatile变量的修改对所有线程可见,体现在读,写两方面
- 写
某个线程在自己的本地内存中修改volatile变量,会立刻刷新到主内存中
- 读
某个线程如果想要读取volatile变量,JMM将该线程对应的本地内存设置为无效,该线程只能从主内存中获取
【Java并发—volatile关键字】volatile只保证变量的单次读写具有原子性,复合操作就没有原子性了
1.3 禁止指令重排序,保证有序性
- 当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后面的操作可见
- 在进行指令优化时,不能将volatile语句与其他语句重排序
文章图片
编译器在生成字节码时,会插入 内存屏障来禁止指令冲排序
- 每个volatile写操作——前面插入一个StoreStore屏障(StoreStore保障到达volatile写时,前面的所有操作都已经同步到主内存中了),后面插入一个StoreLoad屏障
文章图片
- 每个volatile读操作——前面插入LoadLoad和LoadStore
文章图片
volatile只能在有限的一些情况下使用volatile变量代替锁
- 通过CAS对volatile变量进行写
- 对变量的操作必须是原子的(i++这种不行)
推荐阅读
- Spring Boot 最新发布!Java 18 都加入了!!学不动了。。
- 技术分享|MRO工业品行业产业转型,建立B2B集采平台发展业态模式
- 资讯|从苹果 M1 到英伟达 Grace,“缝合风”为何在芯片大厂中盛行()
- java|2020年网络安全状况透视
- Java安全|Spring Cloud Gateway_CVE-2022-22947漏洞复现
- java|Java如何使用实时流式计算处理()
- 安全|Spring Cloud 再爆高危漏洞.... 赶紧修复
- java|Java8接口–默认方法和静态方法
- JUnit5教程(2)_JUnit5测试生命周期及与JUnit4注解的不同