首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

阿里面试官:说说你对java虚拟机中,并发设施和指令重排序的理解!

注意,x86只允许一种重排序规则,即Store操作被重排序到Load后面,而原来的StoreLoad操作变成LoadStore操作,对于CPU级别的指令重排序,我们需要同样由CPU指令集提供的内存屏障(...由于x86只支持StoreLoad重排序,所以x86上的OrderAccess只实现了storeload(),对于其他重排序类型,可以使用编译器屏障简单代替。...虽然x86指令集有专门的内存屏障指令,如lfence、sfence、mfence,但是OrderAccess::storeload()使用了指令加上lock前缀来当作内存屏障指令,因为lock指令前缀具有内存屏障的语意且有时候比...除了LoadLoad、LoadStore、StoreStore、StoreLoad这四种基本内存屏障外,HotSpot VM还定义了特殊的acquire和release内存屏障:acquire防止它后面的读写操作重排序到...另一个值得注意的地方是acquire和release都没有使用StoreLoad屏障,这意味着x86架构原生就具有acquire和release语意。

58300

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

一类是强制读取主内存,强制刷新主内存的内存屏障,叫做Load屏障和Store屏障 (2)另外一类是禁止指令重排序的内存屏障,有四个分别叫做LoadLoad屏障、StoreStore屏障、LoadStore屏障、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指令就被隔离开来,不能重排了 (4)就相当于搞了个栅栏

16030

Java 内存模型 JMM 详解!

Barriers Store1; StoreLoad; Load2 保证Store1的数据在其他处理器前可见(如flush到内存)先于Load2和之后的load的数据的加载。...StoreLoad Barrier能够防止load读取到旧数据而不是最近其他处理器写入的数据。...几乎近代的所有的多处理器都需要StoreLoadStoreLoad的开销通常是最大的,并且StoreLoad具有其他三种屏障的效果,所以StoreLoad可以当做一个通用的(但是更高开销的)屏障。...StoreStore voaltile读/monitor enter LoadLoad LoadStore LoadLoad LoadStore volatile写/monitor exit StoreLoad...关键字的处理上增加屏障来满足内存模型的规则 volatile store前插入StoreStore屏障 所有final字段写入后但在构造器返回前插入StoreStore volatile store后插入StoreLoad

80020

浅析内存屏障以及在java中的应用

StoreLoad屏障:对于这样的语句Store1; StoreLoad; Load2,在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。它的开销是四种屏障中最大的。...比起写入volatile变量之后执行StoreLoad屏障的巨大开销,采用这种方法除了避免重排序而带来的性能损失以外,不会带来其它的性能开销。...即使在其它会发生写写重排序的处理器中,由于StoreStore屏障的性能损耗小于StoreLoad屏障,采用这一方法也是一种可行的方案。...4. volatile语义中的内存屏障 在每个volatile写操作前插入StoreStore屏障,在写操作后插入StoreLoad屏障; 在每个volatile读操作前插入LoadLoad屏障,在读操作后插入

4.7K61

Java 内存模型 JMM 浅析

Barriers Store1; StoreLoad; Load2 保证Store1的数据在其他处理器前可见(如flush到内存)先于Load2和之后的load的数据的加载。...StoreLoad Barrier能够防止load读取到旧数据而不是最近其他处理器写入的数据。...几乎近代的所有的多处理器都需要StoreLoadStoreLoad的开销通常是最大的,并且StoreLoad具有其他三种屏障的效果,所以StoreLoad可以当做一个通用的(但是更高开销的)屏障。...StoreStore voaltile读/monitor enter LoadLoad LoadStore LoadLoad LoadStore volatile写/monitor exit StoreLoad...关键字的处理上增加屏障来满足内存模型的规则 volatile store前插入StoreStore屏障 所有final字段写入后但在构造器返回前插入StoreStore volatile store后插入StoreLoad

73890

About Cache Coherence, Atomic Operation, Memory Ordering, Memory Barrier, Volatile

: 考虑指令执行时,read与write的优先级;(CPU设计时,重点考虑) •CPU Memory Reordering Types –LoadLoad(读读乱序)、LoadStore(读写乱序)、StoreLoad...•解读 – 普通内存操作,只可能存在StoreLoad Reordering; – LoadLoad、LoadStore、StoreStore均不可能Reordering; – 一个Processor的...Writes操作,其他Processor看到的顺序是一致的; – 不同Processors的Writes操作,是没有顺序保证的; •StoreLoad Reordering Problem  – Failure...Extension:StoreLoad Reorder •Question –为什么Intel CPU在LoadLoad,LoadStore,StoreLoad,StoreStore乱序中,仅仅保持了StoreLoad...而StoreLoad Barrier 则为 Expensive Barrier?

1.6K00

6.volatile与JMM

void loadload(); static void storestore(); static void loadstore(); static void storeload...storestore() { release(); } inline void OrderAccess::loadstore() { acquire(); } inline void OrderAccess::storeload...Store1;StoreLoad;Load2 保证 store1 的写操作已刷新到主内存之后,load2 以及其后的读操作才能执行 如何保证有序性?...屏障 StoreStore可以保证在 volatile 写之前,前面的所有普通写操作都刷新至主内存中 StoreLoad避免 volatile 写与其后的 volatile 读/写重排序 如何保证可见性...写数据时加入屏障,强制将线程私有工作内存的数据刷回主物理内存 读数据时加入屏障,线程私有工作内存的数据失败,重新到主物理内存中获取最新的数据 内存屏障四大指令 写屏障的 StoreStore/StoreLoad

5610

volatile原理

屏障前面的读操作不能与后面的所有读操作重排序 StoreStore屏障:StoreStore屏障前面的写操作不能与后面的所有写操作重排序 LoadStore屏障:LoadStore屏障前面的读操作不能与后面的所有写操作重排序 StoreLoad...屏障:StoreLoad屏障前面的写操作不能与后面的所有读操作重排序 java中内存屏障插入策略 在每个volatile写操作的前面插入一个StoreStore屏障 在每个volatile写操作的后面插入一个...StoreLoad屏障 在每个volatile读操作的前面插入一个LoadLoad屏障 在每个volatile读操作的后面插入一个LoadStore屏障 class VolatileBarrierExample...所有写操作的后面插入StoreLoad屏障还有一个重要作用,因为写操作之后方法可能会return,此时编译器无法确定后面时候会有bolatile读或写,所以为了安全起见,编译器通常会在这里插入一个StoreLoad

39220

学完了volatile,你又变强了?难怪面试官不敢为难你

Load1的数据的装载先于Load2及所有后续装载指令的装载 LoadStore屏障: Load1 LoadStore Store2 确保Load1的数据的装载先于Store2及所有后续存储指令的存储 StoreLoad...屏障: Store1 StoreLoad Load2 确保Store1的数据对其他处理器可见(刷新到内存)先于Load2及所有后续的装载指令的装载 StoreStore屏障: Store1 StoreStore...Store2 确保Store1数据对其他处理器可见(刷新到内存)先于Store2及所有后续存储指令的存储 StoreLoad 是一个全能型的屏障,同时具有其他3个屏障的效果。...volatile写 (前后都插入屏障) 前面插入一个StoreStore屏障后面插入一个StoreLoad屏障 volatile读(只在后面插入屏障) 后面插入一个LoadLoad屏障后面插入一个LoadStore...// L1 // StoreStore 确保flag数据对其他处理器可见(刷新到内存)先于number及所有后续存储指令的存储 this.number = 20; // L2 // StoreLoad

19720

并发学习笔记07-volatile的内存语义

在每个volatile写操作的后面插入一个StoreLoad屏障。 在每个volatile读操作的后面插入一个LoadLoad屏障。...从整体执行效率的角度考虑,JMM最终选择了在每个volatile写之后插入一个StoreLoad屏障,而不是volatile读之前。...当读线程大大超过写线程时,选择在volatile写之后插入StoreLoad屏障将带来可观的执行效率的提升。从这里可见JMM在实现上的一个特点:首先确保正确性,然后再去追求执行效率。...因此会省略这3中操作类型对应的内存屏障,JMM仅需在volatile写后面插入一个StoreLoad屏障即可正确实现volatile写-读的内存语义。...这意味着X86处理器中,volatile写的开销比volatile读的开销大很多,因为执行StoreLoad屏障的开销会比较大。

35010
领券