【你问我答】volatile实现机制是怎样的?

问题描述:

volatile实现机制是怎样的?

回答有奖:

选取一位认真回答问题的牛友,赠送200牛币!
▶回答尽量有自己的思考,不要单纯的只是复制粘贴定理定义,或者他人blog哦~

你问我答问题汇总:点击进入
关注你问我答栏目:点击关注

你问我答 - 答问题,成大佬,拿牛币!
你问我答是牛客新栏目,每周1期几个面试中真实遇到的问题,
牛友在问题贴下留下自己的知识,经验与见解,
帮助更多牛友了解更多技术相关知识!
#悬赏##Java##面试题目#
全部评论
volatile 可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在 JVM 底层是基于内存屏障实现的。 1. 当对非 volatile 变量进行读写的时候,每个线程先从内存拷贝变量到 CPU 缓存中。如果计算机有多个CPU,每个线程可能在不同的 CPU 上被处理,这意味着每个线程可以拷贝到不同的 CPU cache 中 2. 而声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步,所以就不会有可见性问题: (1) 对 volatile 变量进行写操作时,会在写操作后加一条 store 屏障指令,将工作内存中的共享变量刷新回主内存;    (2)对 volatile 变量进行读操作时,会在写操作后加一条 load 屏障指令,从主内存中读取共享变量; 通过 hsdis 工具获取 JIT 编译器生成的汇编指令来看看对 volatile 进行写操作CPU会做什么事情,还是用上边的单例模式,可以看到(如图) 有 volatile 修饰的共享变量进行写操作时会多出第二行汇编代码,该句代码的意思是对原值加零,其中相加指令addl前有 lock 修饰。通过查IA-32架构软件开发者手册可知,lock前缀的指令在多核处理器下会引发两件事情:     1. 将当前处理器缓存行的数据写回到系统内存     2. 这个写回内存的操作会引起在其他CPU里缓存了该内存地址的数据无效 正是 lock 实现了 volatile 的「防止指令重排」「内存可见」的特性
点赞 回复 分享
发布于 2020-11-03 21:16
了提高处理器的执行速度,在处理器和内存之间增加了多级缓存来提升。但是由于引入了多级缓存,就存在缓存数据不一致问题。 但是,对于volatile变量,当对volatile变量进行写操作的时候,JVM会向处理器发送一条lock前缀的指令,将这个缓存中的变量回写到系统主存中。 但是就算写回到内存,如果其他处理器缓存的值还是旧的,再执行计算操作就会有问题,所以在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议 缓存一致性协议:每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。 所以,如果一个变量被volatile所修饰的话,在每次数据变化之后,其值都会被强制刷入主存。而其他处理器的缓存由于遵守了缓存一致性协议,也会把这个变量的值从主存加载到自己的缓存中。这就保证了一个volatile在并发编程中,其值在多个缓存中是可见的。
点赞 回复 分享
发布于 2020-11-05 21:30

相关推荐

不愿透露姓名的神秘牛友
01-24 15:05
点赞 评论 收藏
分享
2024-12-31 11:37
已编辑
腾讯_前端开发
秋招结束,做了一个与牛客主流想法完全相反的决定。bg写在开头:本人是电气专业的211本硕,研0开始零基础转前端。历时一年半,刷了三段实习,暑期在🐧厂实习,最后顺利转正了,开的价位也挺满意的,不是白菜。其实家里面非常非常希望我去电网,几乎是从高中开始就帮我选好了这条路。所以家里的意见也一直是我转码路上相当大的阻力,尤其是今年大大小小的吵了很多架。最终也是拗不过我自己的想法,爸妈看到我拿到很好的offer以后,也终于尊重了我的选择。简单说说心理历程:大学期间没有想太多,一直在折腾七七八八的副业。作为期末冲刺型选手,保研了本校本专业。大四毕业做了算法相关的毕设,才发现编程没有想象中的难。于是研0开始考虑别的职业选择。转码的过程不展开多说,也是扎扎实实学了很久。如果也有非科班零基础自学的朋友想看经验分享我也可以后续展开写写。没选电网会不会后悔?我个人觉得,不会。做出这个选择我几乎没有一丝犹豫。1. 电网最大的优势就是稳定性,而这恰巧是我最不看重的点。现在不会失业不代表十年后二十年后不会失业; 世界局势随时可能发生变化,进电网也并非一劳永逸。个人认为这个世界上没有永远稳定的工作,只有稳定的个人能力。2. 本人在大学期间就已经尝试过很多种乱七八糟的副业。也得出了一个结论:当今这个社会想饿死自己是一件很难的事情,在大城市靠一些信息差很容易就能赚到钱。所以也没那么怕失业裁员。3. 本人是金牛座很爱钱,进互联网可以让我在年轻的适合就享受相对高品质的生活,以及更快的攒到第一桶金。以及,其实在东亚家庭里面,钱代表话语权。4. 讨厌体制内的中年领导和热衷打探你私生活没有边界感的同事。当然,以上仅能代表个人的择业观。省会电网本身是个非常非常好的工作,只是不适合和我类似情况的个体。因为在牛客看到了太多劝退互联网无脑进体制内的内容,也想代表非主流的观点发发声。最后,希望所有人都能基于心底真正的想法来进行工作的选择,而非基于对未来不确定性的担忧和恐惧~还没找定工作的朋友们也不要着急,最近有很多补录机会。希望大家都能拿到自己满意的offer!希望大家的2025都能精彩充实! #我的求职思考#  #秋招结束# #大厂#  #电网#  #2025秋招#  
Java抽象带篮子:集美你的决定是正确的😍
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务