• 什么是内存屏障?

  • 小陈:老王,上一篇你引出了volatile底层是通过内存屏障来解决可见性和有序性问题的。首先我想问一下什么是内存屏障?

  • 老王:内存屏障啊,本质上也是一种指令,只不过它具有屏障的作用而已。

  • 小陈:额,这怎么说…

  • 老王:首先内存屏障是一种指令,无论是在JAVA内存模型还是CPU层次,都是有具体的指令对应的,是一种特殊的指令。

  • 小陈:嗯嗯,它是一种特殊的指令。还是不明白…

  • 小陈:然后呢?

  • 老王:然后这种指令*具有屏障的作用*所谓屏障,也就是类似关卡,类似栅栏,具有隔离的作用。

  • 小陈:那它是怎么实现隔离作用的,能否搞个例子讲一下。

  • 老王:哈哈,这个举例没问题,我先跟你说说内存屏障的分类,后面再给你实例讲一下:

  • 老王:按照内存屏障的分类,我理解有两类。

  • (1)一类是强制读取主内存强制刷新主内存的内存屏障,叫做****Load屏障**Store屏障****

  • (2)另外一类是****禁止指令重排序*内存屏障*,有四个分别叫做LoadLoad屏障StoreStore屏障LoadStore屏障StoreLoad屏障

  • 老王:下面再给你介绍一下这两类内存屏障各自的作用:

  • 强制读取/刷新主内存的屏障

  • Load屏障:执行读取数据的时候,强制每次都从主内存读取最新的值。

  • Store屏障:每次执行修改数据的时候,强制刷新回主内存

  • 先给你画图讲解一下Load屏障

  • 如上图所示:在工作内存的变量名、变量的值之前有一道关卡或者栅栏,导致变量 i 获取不到工作内存中的值,所以每次只好主内存重新加载咯

  • 然后再给讲一下Store屏障

  • 如上图所示,每次执行assign指令将数据变更之后,后面都会紧紧跟着一个Store屏障,让你立刻刷新到主内存。

  • 老王:小陈,我画这两图讲强制读取和刷新主内存的屏障(Load屏障Store屏障),你看懂了嘛?

  • 小陈:也就是说,只要加了Load屏障相当于加了一个栅栏,不管工作内存是否有数据,都是从主内存读取数据。只要加了Store屏障具有强制作用,进行assign操作将变量更改了之后,立刻将变量刷新到主内存里面是吗?

  • 老王:是的,就是这么一个道理,上面的图只是为了方便你理解画出来的,实现上并不一定完全跟图的一样,但是原理差不多。

  • 小陈:嘿嘿,老王真棒…

  • 禁止指令重排序的屏障

  • 老王:好了,下面再给你讲讲另外一类的内存屏障,下面这类的内存屏障的作用是禁止指令重排序,JAVA内存模型层次关于禁止重排序有下面4种屏障:

  • LoadLoad屏障

  • 序列:load1指令 LoadLoad屏障 load2指令

  • 作用:在load1指令和load2指令之间加上 LoadLoad屏障,强制先执行load1指令再执行load2指令;load1指令和load2指令不能进行重排序(LoadLoad屏障 前面load指令禁止和屏障后面的load指令进行重排序)。

  • StoreStore屏障

  • 序列:store1指令 StoreStore屏障 store2指令

  • 作用:在store1指令和store2指令之间加上StoreStore屏障,强制先执行store1指令再执行store2指令;store1指令不能和store2指令进行重排序(StoreStore屏障 前面的store指令禁止和屏障后面的store指令进行重排序

  • LoadStore屏障

  • 序列:load1指令 LoadStore屏障 store2指令

  • 作用:在load1指令和store2指令之前加上LoadStore屏障,*强制先执行load1指令再执行store2指令*;load1指令和store2执行不能重排序(LoadStore屏障 前面的load执行禁止和屏障后面的store指令进行重排序

  • StoreLoad屏障

  • 序列:store1指令 StoreLoad屏障 load2指令

  • 作用:在store1指令和load2指令之间加上StoreLoad屏障,强制先执行store1指令再执行load2指令;

  • store1指令和load2指令执行不能重排序(StoreLoad屏障 **前面的Store指令禁止和屏障后面的*Store/Load*指令进行重排)

  • 老王:小陈,我上面说的这几种内存屏障,你能理解吗?

  • 小陈:感觉听着有点玄乎啊,实际上是怎么禁止重排序的啊…

  • 老王:我下面给你画个图,以StoreStore屏障和StoreLoad屏障举个例子,你就知道大概是什么意思了:

  • (1)有三个区域分别是区域1区域2区域3

  • (2)区域1和区域2加了 StoreStore屏障,这样区域1和区域2的Store指令被隔离开来,不能重排了

  • (3)区域2和区域3加了StoreLoad屏障,这样区域2和区域3的Store指令、Load指令就****被隔离开来****,不能重排了

  • (3)就相当于搞了个栅栏,禁止各个区域之间的指令跳来跳去的,否则就会导致乱序执行

  • 小陈:哎呀,原来是搞了个栅栏啊,说白了就是相当于搞了个围墙,不让各个指令之间跳来跳去的,这样达到禁止区域之间重排序的效果。

  • 小陈:牛啊,老王;看起来这么深奥的道理,竟被你搞个图这么简单的说清楚了,献上我的膝盖…

  • 老王:嘿嘿,还好还好…

什么是内存屏障?具有什么作用?相关推荐

  1. 6.什么是内存屏障?具有什么作用?

    什么是内存屏障? 小陈:老王,上一篇你引出了volatile底层是通过内存屏障来解决可见性和有序性问题的.首先我想问一下什么是内存屏障? 老王:内存屏障啊,本质上也是一种指令,只不过它具有屏障的作用而 ...

  2. synchronized原理_synchronized 底层原理与内存屏障

    点击?蓝色" 深入原理",关注并"设为星标" 技术干货,第一时间推送 锁概述 我们知道线程安全问题的产生前提是多个线程并发访问共享变量.共享资源(以下统称为共享 ...

  3. 浅谈内存屏障,C++内存序与内存模型

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可. 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权. 文章目录 引言 一个有意思的问题 ...

  4. java内存屏障的原理与应用

    目录 1. java内存屏障 2.java内存屏障的使用 一. java内存屏障 1.1 什么是内存屏障(Memory Barrier)? 内存屏障(memory barrier)是一个CPU指令.基 ...

  5. 多线程基础——内存屏障

    内存屏障 内存屏障(memory barrier)是一种概念.编译器和CPU可以在保证输出结果一样的情况下对指令重排序,使性能得到优化.插入一个内存屏障,相当于告诉CPU和编译器先于这个命令的必须先执 ...

  6. 深入理解并发内存模型||JMM与内存屏障||多核并发缓存架构 ||JMM内存模型||volatile 关键字的作用 ||JMM 数据原子操作||JMM缓存不一致的问题

    深入理解并发内存模型||JMM与内存屏障 多核并发缓存架构 JMM内存模型 volatile 关键字的作用 JMM 数据原子操作 JMM缓存不一致的问题

  7. 24.volatile关键字的作用、volatile原理、可见性、内存屏障、volatile性能、transient

    24.volatile关键字的作用 24.1.volatile原理 24.2.可见性 24.3.内存屏障 24.4.volatile性能 25.transient 24.volatile关键字的作用 ...

  8. java内存屏障详解_一文读懂Java关键词之volatile作用(内存屏障)

    之前在一篇文章中跟大家一同学习了CPU缓存一致性,通过缓存一致性协议MESI我们可以让CPU各个计算核心中缓存的数据保持一致,避免造成计算结果的差异. 我们还知道Java内存模型中,各个线程还保存了一 ...

  9. 【Java】Volitile的作用、JVM规范如何要求内存屏障、硬件层级内存屏障如何帮助java实现高并发 - 第二天笔记

    第二天笔记 Volitile的使用 保持线程可见性 禁止指令重排:单线程中,两条指令的执行前后顺序不会影响执行结果,CPU流水线会优化执行顺序 如果存在乱序,则不可能出现x=0,y=0的结果 运行结果 ...

最新文章

  1. mysql启动集群报连接本地失败_启动本地安装的pxc集群失败,前面的步骤都检查没错了...
  2. SpringMVC+Spring+mybatis
  3. 2021杭州·云栖大会来了!门票免费预约!
  4. jquery.cookie中的操作
  5. python处理txt文件的一种情况
  6. 百度地图Map属性和方法
  7. Java-练习1:Bank银行模拟程序(面向对象实现)
  8. ios safari 模拟器_Safari调试iOS应用
  9. 重装系统 重启计算机失败,一键重装系统win7后重启进入系统失败
  10. 技术文档系列之架构设计文档模板
  11. 写给小温——当繁花落尽的一刻
  12. 离谱!2019年诺奖得主大翻车!被曝54篇论文涉嫌造假,刚撤回4篇PNAS
  13. Codewar刷题总结
  14. 《Loy解说Eureka服务端源码(一)》
  15. 西瓜中视频是如何赚钱的?教你提高视频收益的3个方法!
  16. Perforce使用中文教程: p4 client
  17. SQL中的PROCEDURE
  18. 绘图软件origin使用总结
  19. 如何将mongo查询结果导出到文件中以及导入到另一个Mongo库中
  20. 2022山东理工大学pta程序设计---实验七(函数)题解

热门文章

  1. AMBA协议之AXI协议——中文翻译
  2. 前端利用正则对手机号码,身份证号,姓名进行脱敏处理
  3. 5个适合新手练习的Python刷题网站
  4. 正则表达式匹配标签里面的内容
  5. iOS测试工程师如何用xcode进行性能测试
  6. RN+SDK套壳轻松解决苹果审核被拒3.2.1问题、2.1大礼包问题【最新上架技术】
  7. 缓存在日常生活中的体现
  8. 以太网、网络拓扑结构分类、双绞线的传输距离和分类
  9. react加水印_多功能React影像组件(拖拽、水印、缩放、切换、旋转)
  10. 《博弈论》异或 博弈x^x第二手只能一定赢吗?