关注
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 的「防止指令重排」「内存可见」的特性
查看原帖
点赞 评论
相关推荐
牛客热帖
更多
正在热议
更多
# 面包vs爱情,怎么选? #
1730次浏览 35人参与
# 实习生如何通过转正 #
103576次浏览 1391人参与
# 深信服秋招来了 #
278995次浏览 2914人参与
# 安克创新求职进展汇总 #
53178次浏览 526人参与
# tplink提前批进度交流 #
206198次浏览 1503人参与
# Tplink求职进展汇总 #
179460次浏览 910人参与
# 爱玛科技集团求职进展汇总 #
25469次浏览 191人参与
# 职场新人体验 #
81658次浏览 586人参与
# 面试被问“你的缺点是什么?”怎么答 #
153192次浏览 2089人参与
# 互联网公司爆料 #
144039次浏览 708人参与
# 秋招结束之后的日子 #
85278次浏览 974人参与
# 贝壳求职进展汇总 #
33555次浏览 183人参与
# 硬件/芯片公司岗位评价 #
7622次浏览 28人参与
# 招银网络求职进展汇总 #
165451次浏览 984人参与
# 联影求职进展汇总 #
42379次浏览 282人参与
# 华为海思工作体验 #
28473次浏览 119人参与
# 新凯来求职进展汇总 #
48526次浏览 125人参与
# 26届秋招投递记录 #
48160次浏览 495人参与
# 应届生,你找到工作了吗 #
68330次浏览 458人参与
# 材料进Fab厂真的劝退吗? #
55575次浏览 203人参与
# 秋招最大的收获是什么? #
44981次浏览 356人参与
# 机械制造岗投递时间线 #
31705次浏览 379人参与