Java并发-内存屏障

现代的处理器使用写缓冲区临时保存内存写入的数据。写缓冲区可以保证指令流水线持续运行,他可以避免由于处理器停顿下来等待内存写入数据而产生的延迟。同时,通过以批处理的方式刷新写缓冲区,以及合并写缓冲区中对同一个内存地址的多次写,减少对内存总线的占用。每个处理去上的写缓冲区,仅仅对它所在的处理器可见。这个特性会对内存操作的执行顺序产生重要的影响:处理器对内存的读/写操作的执行顺序,不一定与内存实际发生的读/写操作顺序一致。
这里写图片描述
如果并行执行,最终可能得倒x=y=0
这里写图片描述

可能执行的顺序是A1-A2-A3
为了保证内存可见性,Java编译器在生成指令序列的适当为止会插入内存屏障
这里写图片描述

StoreLoad是一个全能型的屏障,同时具有其他3个屏障的效果。现代的多处理器大多支持该屏障(其他类型的屏障不一定被所有处理器支持)。这个屏障开销会很昂贵,因为当前处理器通常要把写缓冲区中的数据全部刷新到内存中。

猜你喜欢

转载自blog.csdn.net/qq_29842929/article/details/80784739