网站首页 > 文章精选 正文
一位6年工作经验的小伙伴,在某里二面的时候被问到“volatile”关键字。然后,就没有然后了…
同样,还有一位4年的小伙伴,去某团面试也被问到“volatile 关键字“。然后,也没有然后了…
volatile关键字是Java并发编程中的一个重要的关键字,这个问题确实问得比较底层了。难道大厂现在都这么卷了吗?那今天呢,我给大家分享一下我的理解,希望能够帮助到大家。
1、volatile的作用
volatile 关键字呢,有两个作用:
第1个,是可以保证在多线程环境下共享变量的可见性。
第2个,是可以屏蔽在多线程环境下CPU的指令重排。
下面,我给大家详细介绍一下可见性和屏蔽指令重排以及volatile的工作原理。
2、原理分析
先来看变量的可见性,简单来说,就是指当某一个线程对共享变量的修改,其他线程可以立刻看到修改之后的值。其实这个可见性问题,我认为本质上是由以下两个方面造成的。
首先是,CPU的高速缓存。在 CPU 里面设计了三级缓存去解决 CPU 运算效率和内存 IO 效率问题,但是有带来了缓存的一致性问题,而在多线程并行执行的情况下,缓存一致性就会导致可见性问题。
所以,对于增加了 volatile 关键字修饰的共享变量,JVM 虚拟机会自动增加一个#Lock 汇编指令,这个指令会根据 CPU 型号自动添加总线锁或/缓存锁。
我简单介绍一下这两种锁:
总线锁是锁定了 CPU 的前端总线,从而导致在同一时刻只能有一个线程去和内存通信,这样就避免了多线程并发造成的可见性。
缓存锁是对总线锁的优化,因为总线锁导致了 CPU 的使用效率大幅度下降,所以缓存锁只针对 CPU 三级缓存中的目标数据加锁,缓存锁是使用 MESI 缓存一致性来实现的。
然后,就是屏蔽指令重排,就是指屏蔽CPU指令重排序。意思是在多线程环境下,CPU指令的编写顺序和执行顺序不一致,从而导致可见性问题,为了提升 CPU 的利用率,CPU引入了StoreBuffer 机制,而这一种优化机制会导致 CPU 的乱序执行。当然为了避免这样的问题,CPU 提供了内存屏障指令,上层应用可以在合适的地方插入内存屏障来避免 CPU 指令重排序问题。而volatile就是通过设置内存屏障来禁止指令重排。
volatile内存屏障实现原理主要从以下两个方面来分析:
第1个是:volatile会在变量写操作的前后加入两个内存屏障,来保证前面的写指令和后面的读指令是有序的,如图所示:
第2个是:volatile在变量的读操作后面插入两个指令,禁止后面的读指令和写指令重排序。,如图所示:
volatile其实可以看作是轻量级的synchronized,虽然说volatile不能保证原子性,但是如果在多线程下的操作本身就是原子性操作(例如赋值操作),那么使用volatile会优于synchronized。以上就是我对volatile 关键字的理解。
并发编程是每个程序员必须要掌握好的领域,它里面涵盖的设计思想、和并发问题的解决思路、以及作为一个并发工具,都是非常值得深度研究的。
我是被编程耽误的文艺Tom,如果我的分享对你有帮助,请动动手指分享给更多的人。关注我,面试不再难!
最后,7/8/9月份资料文档已整理,包含如下↓(还在持续更新中!):
①100道最新大厂经典面试题解析资料文档!
②15万+字Java面试题解析和配套答案!
③从应届生到高级开发都适用的简历模板!
④从入门到精通的架构师学习路线图!
⑤还有各种技术流程图,路径图!
有需要的 Si 我 “666”拿!
- 上一篇: Java线程安全: volatile关键字的常见功能及用法
- 下一篇: 彻底理解volatile
猜你喜欢
- 2025-01-18 如何判断 Excel 每个单元格中是否包含某个字?
- 2025-01-18 关键字看成就·电丨从点点烛光到万家灯火,75年间山东电力千倍级增长
- 2025-01-18 新华全媒头条|闯、创、育——从三个关键字看上海国际科创中心建设(7)
- 2025-01-18 精品博客vivado、ISE、quartus ii与notepad++的关联
- 2025-01-18 两千字读懂WCAG无障碍指南
- 2025-01-18 简单学Python——关键字4——and、or和not
- 2025-01-18 面试之每日一问——volatile关键字的作用
- 2025-01-18 volatile关键字原理的使用介绍和底层原理解析和使用实例
- 2025-01-18 C语言关键字之volatile
- 2025-01-18 彻底理解volatile
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)