内存屏障到底是什么东西?

229 阅读1分钟
volatile可以使代码保持有序性,是使用内屏屏障实现的,但是内存屏障是什么东西?

好吧,经过数小时的研究,各个网站上的教程,最详细的都只是说了它是一条特殊的指令,或许我们可以把这些指令看作是一面面的墙壁,代码不能在越过墙执行,从而阻止了代码的重排序问题。(我也不知道对不对,暂时先这么理解)。

内存屏障是一条特殊的指令,内存屏障前的指令必须全部执行完之后,才能执行屏障后面的指令。(不准确,看后面的分析)

image.png

  • 第二个操作是volatile写时,不管第一个操作是什么,都不能重排序。确保volatile写操作刷新内存里共享变量的值时,程序员希望发生的变动都能够正确的刷新到内存中 所以,在写操作前插入StoreStore屏障

  • 第一个操作是volatile写时,第二个操作的volatile读/写操作都不能重排序。所以在写操作后插入StoreLoad屏障

  • 第一个操作是volatile读时,不管第二个操作是什么,都不能重排序。确保volatile读操作读取内存里的最新值是程序员希望读到的、操作的值对于后续的读操作,则应在volatile读后插入LoadLoad屏障;对于后续的写操作,则应在volatile读后插入LoadStore屏障。

    附:如storestore屏障,意思是先保存,后保存,先理解,再记忆。