volatile实现原理

via:yzwall技术笔记 https://www.cnblogs.com/yzwall/p/6661528.html

volatile变量写,汇编指令会多出Lock前缀,Lock前缀在多核处理器下的作用:

  • 将当前处理器缓存行的数据写回主存;
  • 令其他CPU里缓存该内存地址的数据无效;

针对编译器重排序:JMM针对编译器指定了volatile重排序规则表,规定哪些先后操作不能进行编译器重排序:
这里写图片描述
针对处理器重排序:编译器在生成字节码指令时,通过在指令序列中插入内存屏障指令来禁止特定类型的处理器重排序,以实现volatile内存语义:volatile底层通过内存屏障指令实现
这里写图片描述
在每个volatile变量写操作之前插入StoreStore屏障,之后插入StoreLoad屏障;
之前插入StoreStore屏障:禁止volatile写之前的写操作与其重排序,保证之前的所有写操作都写回主存,对volatile写可见;
之后插入StoreLoad屏障:禁止volatile写之后的读写操作与其重排序,实现volatile写结果对后续操作可见;
在每个volatile变量读操作之后,接连插入LoadLoad屏障,LoadStore屏障;
插入LoadLoad屏障:禁止volatile变量读之后的读操作与其重排序;
插入LoadStore屏障:禁止volatile变量读之后的写操作与其重排序;
通过插入两次内存屏障,实现volatile读结果对后续操作可见;
JMM通过上述内存屏障插入策略,保证在任意平台上volatile的内存语义一致;


关键字语义

volatile用来修饰共享变量(成员变量,static变量)表明:
volatile变量写:当写一个volatile变量时,JMM会把所有线程本地内存的对应变量副本刷新回主存;
volatile写和解锁内存语义相同;
volatile变量读:当读一个volatile变量时,JMM会设置该线程的volatile变量副本(本地内存中)无效,线程只能从主存中读取该变量;
保证了volatile变量读,总能看见对该volatile变量最后的修改;
volatile变量读和加锁内存语义相同;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值