面试高频Volatile

Volatile及其实现

相关的CSDN博客:

Volatile关键字

1、可见性:

Java内存模型规定:所有变量都需要存储在主内存中,线程工作内存保存了变量在主内存中的副本,线程对变量的所有操作都在工作内存中进行,执行结束后在同步到主内存中去。这里必然会存在时间差,在这个时间差内,该线程对副本的操作,对于其他线程是不见的,从而造成了可见性问题。

2、指令重排序

JVM对代码进行编译优化,导致代码可能并不是按照代码编写顺序执行,而是按照JVM进行编译优化后的顺序执行。指令重排序对并发编程安全性有很大影响,所以提供了一些happens-before规则定义一些禁止编译优化的场景。

3、volatile的作用

  • 保证共享变量的可见性:使用volatile修饰的变量,任何线程对其进行操作都是在主内存中进行的,不会产生副本,从而保证共享变量的可见性。

  • 防止局部指令重排序:happens-before规则中的volatile变量规则规定了一个线程先去写一个volatile变量,然后一个线程去读这个变量,那么这个写操作的结果一定对读的这个线程可见。

4、volatile如何防止指令重排序

volatile是通过内存屏障来防止指令重排序的

硬件层面的内存屏障分为Load Barrier 和 Store Barrier即读屏障和写屏障

对于Load Barrier来说,在指令前插入Load Barrier,可以让高速缓存中的数据失效,强制从新从主内存加载数据。对于Store Barrier来说,在指令后插入Store Barrier,能让写入缓存中的最新数据更新写入主内存,让其他线程可见。

图片说明

volatile防止指令重排序具体步骤:

在每个volatile写操作的前面插入一个StoreStore屏障。

在每个volatile写操作的后面插入一个StoreLoad屏障。

在每个volatile读操作的后面插入一个LoadLoad屏障。

在每个volatile读操作的后面插入一个LoadStore屏障

图片说明

图片说明

#Java##学习路径#
全部评论

相关推荐

如果面试被问到不会的问题,不要直接说“不知道”。尽自己最大努力,最好把自己的思考思路和过程说出来,很多都是开放性问题,甚至面试官也不知道答案,考察的就是你解决问题的思路。这其实是面试里的 “压力测试题”—— 面试官要的不是标准答案,而是看你面对知识盲区时的心态、逻辑和学习能力。直接说 “不知道”,等于主动放弃了展示自己的机会;但胡编乱造、不懂装懂,只会让面试官对你的印象分暴跌。1.先坦诚承认,不回避短板可以说 “这个问题我目前没有深入研究过,但我可以说说我的理解思路”,或者 “这块技术我接触得比较少,不过我可以从相似的技术点出发分析一下”。坦诚的态度会让面试官觉得你很实在,不会反感。2.再拆解问题,说清思考路径把不会的问题拆成自己熟悉的小模块,一步步推导。比如被问到 “如何设计一个高并发的秒杀系统的分布式锁方案”,如果没做过,就可以说 “首先,分布式锁的核心是解决多节点竞争资源的问题,常见的实现方式有 Redis、ZooKeeper 这些。秒杀场景的特点是并发量高、瞬时流量大,所以需要考虑锁的原子性和释放机制…… 虽然我没直接做过,但我觉得可以从这几个角度去设计和优化”。哪怕最后没给出完美答案,清晰的拆解逻辑已经赢了一半。3.最后主动补充,展示学习意愿说完思路后,可以加一句 “这个问题确实很有挑战性,我下来会去深入研究一下 Redis 分布式锁的具体实现细节,尤其是秒杀场景下的性能优化方案”。这句话能传递出你的学习主动性,让面试官觉得你是个 “愿意钻研” 的人。
面试被问到不会的问题,你...
点赞 评论 收藏
分享
评论
2
27
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务