概念

为了禁止编译器和CPU对代码进行重排序,在编译器和CPU层面上都有对应的指令,这个就是内存屏障。

编译器的内存屏障只是为了告诉编译器不要对指令进行重排序。当编译完了以后,这种内存屏障就消失了,CPU并不会感知到编译器层面的内存屏障。

基础的四种内存屏障指令

image.png

新增

从JDK8开始,在Unsafe类中提供了三个内存屏障函数。

  1. public final class Unsafe{
  2. ***
  3. public native void loadFence();
  4. public native void storeFence();
  5. public native void fullFence();
  6. ***
  7. }

在JDK9中对JDK定义的三种内存屏障与理论层面划分的四类内存屏障之间的对应进行了说明:

loadFence = LoadLoad+LoadStore storeFence = StoreStore+LoadStore fullFence = StoreStore+LoadStore+StoreLoad