前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >volatile 回忆篇

volatile 回忆篇

作者头像
平凡的学生族
发布2019-05-25 08:51:20
4740
发布2019-05-25 08:51:20
举报
文章被收录于专栏:后端技术

谈谈volatile

volatile->可见性、有序性->happens-before原则、volatile内存语义(结合JMM理解) happens-before原则>禁止指令重排序(三个层面)->

  1. 编译器层面->volatile重排序规则表
  2. 处理器层面->使用内存屏障
  3. 内存层面->#Lock或缓存一致性协议(MESI协议)

volatile禁止重排序怎么实现的?

在volatile的指令前,加入lock前缀。它会产生一组内存屏障,防止重排序。 lock前缀会使写入缓存的数据写回内存,并让其它缓存的数据失效。

编译器指令重排序

(表格)

  1. volatile写之前的指令不能排到后面。保证volatile写指令开始时,前面的指令都完成了
  2. volatile读之后的指令不能 排到前面。volatile读之后的指令,要等到volatile读完成才能 开始 。
  3. volatile读之前的volatile写,不能排到其后面。保证 volatile读开始时,其前面的volatile写已经完成。

1.2能保证标志位例子 1.2.3 能保证DCL。DCL中,instance = new XX();包含三个指令,它们可能被重排序。

  • 如果有volatile,则保证if(instance == NULL)为假时,instance = new XX();语句已经全部完成。
  • 如果 没有volatile,则if(instance == NULL)为假时, new XX();可能才进行到一半。

happens-before

满足happens-before的指令之间不能重排序。hb后的指令能看到hb前的指令的执行结果。

指令重排序

处理器为了加快执行速度,会自行将指令重排序。

MESI

MIT讲座

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.04.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 谈谈volatile
  • volatile禁止重排序怎么实现的?
  • 编译器指令重排序
  • happens-before
  • 指令重排序
  • MESI
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档