一、概念
内存屏障是一种指令,无论是在JAVA内存模型还是CPU层次,都有具体指令对应的。这种指令具有屏障的所用类似关卡、栅栏的作用。
二、内存屏障分类
- 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屏障这类内存屏障起到禁止指令重排序的功能(解决有序性问题)