Java虚拟机底层实际上是借助内存屏障来实现刷新处理器缓存和冲刷处理器缓存这两个动作的。
内存屏障(Memory Barrier,也称Fence)是对一类针对内存读、写操作指令(Instruction)的跨处理器架构(比如x86、ARM)的比较底层的抽象(或者称呼)
内存屏障是被插入到两个指令之间进行使用的,其作用是禁止编译器、处理器重排序从而保障有序性的
为了实现禁止重排序的功能,这些指令也往往有一个副作用——刷新处理器缓存、冲刷处理器缓存,从而保障可见性
内存屏障的类型划分
按照可见性保障划分
加载屏障(Load Barrier)
作用:刷新处理器缓存存储屏障(Store Barrier)
作用:冲刷处理器缓存
按照有序性保障划分
获取屏障(Acquire Barrier)
使用方式:在一个读操作(包括Read-Modify-Write以及普通的读操作)之后插入该内存屏障
作用:禁止与其后的任何读写操作进行重排序,这相当于在进行后续操作之前先要获取相应共享数据的所有权释放屏障(Release Barrier)
使用方法:在一个写操作之前插入该内存屏障
作用:禁止该写操作与之前的任何读写操作进行重排序,这相当于在对相应共享数据操作结束后释放所有权