7.内存屏障

254 阅读2分钟

一、概念

内存屏障是一种指令,无论是在JAVA内存模型还是CPU层次,都有具体指令对应的。这种指令具有屏障的所用类似关卡、栅栏的作用。

二、内存屏障分类

image.png

  • Load屏障

作用:执行读取数据的时候,强制每次都从主内存读取最新的值。

  • Store屏障

作用:每次执行修改数据的时候,强制刷新回主内存

  • LoadLoad屏障

序列:load1指令 LoadLoad屏障 load2指令

作用:在load1指令和load2指令之间加上 LoadLoad屏障,强制先执行load1指令再执行load2指令;load1指令和load2指令不能进行重排序(LoadLoad屏障 前面load指令禁止和屏障后面的load指令进行重排序)。

  • StoreStore屏障

序列:store1指令 StoreStore屏障 store2指令

作用:在store1指令和store2指令之间加上StoreStore屏障,强制先执行store1指令再执行store2指令;store1指令不能和store2指令进行重排序(StoreStore屏障 前面的store指令禁止和屏障后面的store指令进行重排序)

  • LoadStore屏障

序列:load1指令 LoadStore屏障 store2指令

作用:在load1指令和store2指令之前加上LoadStore屏障,强制先执行load1指令再执行store2指令;load1指令和store2执行不能重排序(LoadStore屏障 前面的load执行禁止和屏障后面的store指令进行重排序)

  • StoreLoad屏障

序列:store1指令 StoreLoad屏障 load2指令

作用:在store1指令和load2指令之间加上StoreLoad屏障,强制先执行store1指令再执行load2指令;

store1指令和load2指令执行不能重排序(StoreLoad屏障 前面的Store指令禁止和屏障后面的Store/Load指令进行重排)

三、总结

内存屏障可以两大类:

  • Load屏障/Store屏障:强制读取主内存、强制刷新主内存的内存屏障(解决可见性问题)
  • LoadLoad屏障、StoreStore屏障、LoadStore屏障、StoreLoad屏障这类内存屏障起到禁止指令重排序的功能(解决有序性问题)