美文网首页Java
(十四)内存屏障

(十四)内存屏障

作者: hedgehog1112 | 来源:发表于2019-06-04 22:27 被阅读0次

重排

内存屏障

内存屏障种类

编译器和处理器必须同时遵守重排规则。多核处理器需使用内存屏障指令来确保一致性。即使编译器优化掉了一个字段访问(因为一个读入的值未被使用),需要产生内存屏障,就像这个访问仍然需要保护。(可参考下面的优化掉内存屏障的章节)。

内存屏障指令仅直接控制CPU与其缓存之间,与垃圾回收机制中“写屏障(write barriers)”无关。

一、重排序

编译器或者CPU的代码的结构重排排序,达到最佳效果。

(1)编译器重排

CPU只读一次的x和y值。不需反复读取寄存器交替x和y值

(2)处理器重排

写缓存区没有及时刷新,使得处理器执行的读写操作与内存上顺序不一致

处理器A读b=0,处理器B读a=0。A1写a=1先写到处理器A的写缓存区中,此时内存中a=0。如果这时处理器B从内存中读a,读到的将是0。

可能会出现x,y都是0。

二、内存屏障

为了解决上述问题,处理器提供内存屏障指令(Memory Barrier):

写内存屏障(Store Memory Barrier):处理器将存储缓存值写回主存(阻塞方式)。

读内存屏障(Load Memory Barrier):处理器,处理失效队列(阻塞方式)。

保证两个操作之间数据的可见性。

volatile读前插读屏障,写后加写屏障,避免CPU重排导致的问题,实现多线程之间数据的可见性

三、内存屏障的种类

StoreLoad开销最大。万能屏障,兼具其它三种内存屏障功能。执行时,处理器通常要把写缓冲区中的数据全部刷新的内存中

对于处理器来说,内存屏障会导致cpu缓存的刷新,刷新时,会遵循缓存一致性协议。

lock解锁时,jvm会强制刷新cpu缓存,导致当前线程更改,对其他线程可见。

volatile:标记volatile的字段,在操作时,会强制刷新cpu缓存,标记volatile的字段,每次读取都是直接读内存

final:即时编译器在final写操作后,会插入内存屏障,来禁止重排序,保证可见性

相关文章

  • (十四)内存屏障

    重排 内存屏障 内存屏障种类 编译器和处理器必须同时遵守重排规则。多核处理器需使用内存屏障指令来确保一致性。即使编...

  • leveldb源码学习--skiplist

    Skiplist原理 内存屏障 内存屏障,也称内存栅栏,内存栅障,屏障指令等,是一类同步屏障指令,是CPU或编译器...

  • Java的final关键字的内存语义

    概念介绍: 1.内存屏障: 内存屏障(Memory Barier,或者有时叫做内存栅栏,Memory Fence)...

  • 内存屏障在CPU、JVM、JDK中的实现

    前言 内存屏障(英语:Memory barrier),也称内存栅栏,内存栅障,屏障指令等,是一类同步屏障指令,它使...

  • 什么是内存屏障?

    内存屏障:是一种CPU质量,用于控制特定条件下的重排序和内存可见性问题。又称:内存栅栏 内存屏障作用: 阻止屏障两...

  • 内存屏障

    内存屏障(Memory Barrier,或有时叫做 内存栅栏,Memory Fence)是一种CPU指令,用于控制...

  • 内存屏障

  • 内存屏障

    内存屏障(Memory barrier) 为什么会有内存屏障 每个CPU都会有自己的缓存(有的甚至L1,L2,L3...

  • 内存屏障

    内存屏障的作用 保证数据的可见性我们知道,内存中的数据除了在内存中的副本,还有可能在各个核的CPU中,当某个核修改...

  • 内存屏障

    我们看到这个词语的时候觉得很高端,但是本质很简单,就是指定==事件先后执行的顺序== 一、意义 想要了解内存屏障,...

网友评论

    本文标题:(十四)内存屏障

    本文链接:https://www.haomeiwen.com/subject/hvvcxctx.html