Java多线程中,如何准确理解内存屏障在内存读写中的作用?
- 内容介绍
- 文章标签
- 相关推荐
本文共计3724个文字,预计阅读时间需要15分钟。
在现代计算机中,CPU通常都是多核的。每个CPU Core都有其自己的高速缓存Cache。因此,内存数据读写可能存在不一致性,导致指令乱序与不可见性问题。
在现代计算机中,CPU往往都是多核的,而由于每个CPU Core中都有自己的高速缓存Cache,因此就会造成内存数据读写的不一致性,表现为指令乱序与不可见性问题。为此,java为了统一物理世界中的计算机组成架构,提出了JMM内存模型,并抽象了LoadLoad,StoreStore,LoadStore,StoreLoad四个内存屏障指令来应对不同CPU的体系。本文先介绍下多核CPU体系下,并发编程需要克服的问题,然后再介绍下Java的内存屏障各自的含义,并举例说明对应的场景。
顺序性与可见性
在执行程序时,为了提高性能,编译器和处理器会通常对指令进行重排序,即:
也就是说,即使指令的执行没有重排序,是按顺序执行的,但由于缓存的存在,仍然会出现数据的非一致性的情况。我们把这种普通读``普通写可以理解为是有延迟的延迟读、延迟写,因此即使读在前、写在后,因为有延迟,然后仍然会出现写在前、读在后的情况。
本文共计3724个文字,预计阅读时间需要15分钟。
在现代计算机中,CPU通常都是多核的。每个CPU Core都有其自己的高速缓存Cache。因此,内存数据读写可能存在不一致性,导致指令乱序与不可见性问题。
在现代计算机中,CPU往往都是多核的,而由于每个CPU Core中都有自己的高速缓存Cache,因此就会造成内存数据读写的不一致性,表现为指令乱序与不可见性问题。为此,java为了统一物理世界中的计算机组成架构,提出了JMM内存模型,并抽象了LoadLoad,StoreStore,LoadStore,StoreLoad四个内存屏障指令来应对不同CPU的体系。本文先介绍下多核CPU体系下,并发编程需要克服的问题,然后再介绍下Java的内存屏障各自的含义,并举例说明对应的场景。
顺序性与可见性
在执行程序时,为了提高性能,编译器和处理器会通常对指令进行重排序,即:
也就是说,即使指令的执行没有重排序,是按顺序执行的,但由于缓存的存在,仍然会出现数据的非一致性的情况。我们把这种普通读``普通写可以理解为是有延迟的延迟读、延迟写,因此即使读在前、写在后,因为有延迟,然后仍然会出现写在前、读在后的情况。

