初步认识Volatile-CPU层面的内存屏障
什么是内存屏障?从前面的内容基本能有一个初步的猜想,内存屏障就是将 store bufferes中的指令写入到内存,从而使得其他访问同一共享内存的线程的可见性。
X86的memory barrier指令包括lfence(读屏障) sfence(写屏障) mfence(全屏障)Store Memory Barrier(写屏障) 告诉处理器在写屏障之前的所有已经存储在存储缓存(store bufferes)中的数据同步到主内存,简单来说就是使得写屏障之前的指令的结果对屏障之后的读或者写是可见的
Load Memory Barrier(读屏障) 处理器在读屏障之后的读操作,都在读屏障之后执行。配合写屏障,使得写屏障之前的内存更新对于读屏障之后的读操作是可见的
Full Memory Barrier(全屏障) 确保屏障前的内存读写操作的结果提交到内存之后,再执行屏障后的读写操作
有了内存屏障以后,对于上面这个例子,我们可以这么来改,从而避免出现可见性问题
总的来说,内存屏障的作用可以通过防止CPU对内存的乱序访问来保证共享数据在多线程并行执行下的可见性
但是这个屏障怎么来加呢?回到最开始我们讲volatile关键字的代码,这个关键字会生成一个Lock的汇编指令,这个指令其实就相当于实现了一种内存屏障
这个时候问题又来了,内存屏障、重排序这些东西好像是和平台以及硬件架构有关系的。作为Java语言的特性,一次编写多处运行。我们不应该考虑平台相关的问题,并且这些所谓的内存屏障也不应该让程序员来关心。
初步认识Volatile-CPU层面的内存屏障相关推荐
- 关于volatile、MESI、内存屏障、#Lock
最近又看了下Disruptor,里面提到了内存屏障,突然想到了指令重排.还有可见性,感觉里面关系有点乱,就翻了下,因此就写了这篇文章 带着几个问题: 1.volatile,是怎么可见性的问题(CPU缓 ...
- CPU缓存和内存屏障
CPU性能优化手段-缓存 为了提高程序运行的性能,现代CPU在很多方面对程序进行了优化. 例如:CPU高速缓存.尽可能地避免处理器访问主内存的时间开销,处理器大多会利用缓存(cache)以提高性能. ...
- CPU高速缓存和内存屏障
一.CPU性能优化手段--缓存 为了提高程序运行的性能,现代CPU在很多方面对程序进行了优化. 例如:CPU高速缓存.尽可能地避免处理器访问主内存的开销,处理器大多会利用缓存以提高性能. 二.多级缓存 ...
- JMM如何解决顺序一致性问题-JMM层面的内存屏障
为了保证内存可见性,Java编译器在生成指令序列的适当位置会插入内存屏障来禁止特定类型的处理器的重排序,在JMM中把内存屏障分为四类
- JMM层面的内存屏障-HappenBefore
它的意思表示的是前一个操作的结果对于后续操作是可见的,所以它是一种表达多个线程之间对于内存的可见性.所以我们可以认为在JMM中,如果一个操作执行的结果需要对另一个操作课件,那么这两个操作必须要存在ha ...
- 汇编为什么分段执行总是执行不了_iOS汇编教程(六)CPU 指令重排与内存屏障...
系列文章 iOS 汇编入门教程(一)ARM64 汇编基础 iOS 汇编入门教程(二)在 Xcode 工程中嵌入汇编代码 iOS 汇编入门教程(三)汇编中的 Section 与数据存取 iOS 汇编教程 ...
- volatile 和 内存屏障
volatile 和 内存屏障 - 哈哈呵h - 博客园 接下来看看volatile是如何解决上面两个问题的: 被volatile修饰的变量在编译成字节码文件时会多个lock指令,该指令在执行过程中会 ...
- 内存屏障(cpu内存屏障 与java内存屏障)
文章目录 CPU 内存屏障 定义 读写屏障指令 为什么会出现内存屏障 java内存屏障 java内存屏障存在意义 java中内存屏障的主要类型 LoadLoad 屏障 StoreStore 屏障 Lo ...
- java volatile内存屏障_volatile 和 内存屏障
接下来看看volatile是如何解决上面两个问题的: 被volatile修饰的变量在编译成字节码文件时会多个lock指令,该指令在执行过程中会生成相应的内存屏障,以此来解决可见性跟重排序的问题. 内存 ...
最新文章
- android接收不能广播,【11-16求助】急急急,service中无法接收广播!
- 自制vue组件通信插件:教你如何用mixin写插件
- .NET Core 的Generic Host 之Generic Host Builder
- dreamhost 优惠码_DreamHost如何通过OpenStack重塑自己
- 数据结构 8-0 排序
- shell中txt转EXCEL
- Qt之QThread介绍(常用接口及实现、自动释放内存、关闭窗口时停止线程运行、同步互斥)
- CKplayer功能配置
- python 爬取taptap热门榜
- 01. Linux文件目录结构及存放内容(功能)
- 在eclipse中编写word count的Java程序打包到虚拟机中运行
- 张尚老师 一位把心理学融入每一堂课程的实战教练式管理专家。学员追捧的大哥哥老师~
- Java学习软件安装详解
- 解决IOS微信浏览器底部会出现向前向后返回按钮问题
- 前端常见问题以及处理方式 - - - (九) ES6中的set和map(map篇)
- flutter widget super(key: key)的作用(五)
- 矿物质饲料的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 保姆级教程 玩客云 刷armbian 挂甜糖CDN GIF动图教程
- plc的日常维护和保养
- MAX31856中文文档