内存屏障四种类型:
1.1、Load指令和Store指令
Load指令(读屏障):将内存的数据拷贝到处理器缓存
Store指令(写屏障):让当前线程写入缓存的数据可以被其他线程看见
1.2、LoadLoad Barriers
排队,当第一个读屏障指令读取数据完毕之后,后一个读屏障指令才能够进行加载读取
(禁止读和读的重排序)
1.3、StoreStore Barriers
当A写屏障指令写完之后且保证A的的写入可以被其他处理器看见,再进行B的写入操作
(禁止写与写的重排序)
1.4、LoadStore Barriers
前一个读屏障指令读取完毕后,后一个写屏障指令才会进行写入
(禁止读和写的重排序)
1.5、StoreLoad Barriers
全能屏障,同时具有前三个的类型的效果,但开销较大。
先保证A的写入会被其他处理器可见,才进行B的读取指令
(禁止写和读的重排序)
volatile:在每一个写的volatile前后插入写屏障,读的volatile前后插入读屏障。
写,在每一次写入之前屏障拿到其他的线程修改的数据(因为可见性和重排序)。写入后的屏障可以被其他线程拿到最新的值。
读,在每一个读之前屏障获取某个变量的值的时候,这个值可以被其他线程也获取到。读取后的屏障可以在其他线程修改之前获取到主内存变量的当前值