Java多线程中,如何准确理解内存屏障在内存读写中的作用?

2026-05-29 09:242阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计3724个文字,预计阅读时间需要15分钟。

Java多线程中,如何准确理解内存屏障在内存读写中的作用?

在现代计算机中,CPU通常都是多核的。每个CPU Core都有其自己的高速缓存Cache。因此,内存数据读写可能存在不一致性,导致指令乱序与不可见性问题。

在现代计算机中,CPU往往都是多核的,而由于每个CPU Core中都有自己的高速缓存Cache,因此就会造成内存数据读写的不一致性,表现为​​指令乱序​​​与​​不可见性​​​问题。为此,java为了统一物理世界中的计算机组成架构,提出了JMM内存模型,并抽象了​​LoadLoad​​​,​​StoreStore​​​,​​LoadStore​​​,​​StoreLoad​​四个内存屏障指令来应对不同CPU的体系。本文先介绍下多核CPU体系下,并发编程需要克服的问题,然后再介绍下Java的内存屏障各自的含义,并举例说明对应的场景。

顺序性与可见性

在执行程序时,为了提高性能,编译器和处理器会通常对指令进行重排序,即:

  • 编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
  • 指令级并行的重排序。现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。 (同时,由于处理器中有缓存的存在,导致数据不一致,从读写操作上看,也存在类似的乱序重排的效果,即:内存系统的重排序)
  • 内存系统的重排序。由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。
  • 也就是说,即使指令的执行没有重排序,是按顺序执行的,但由于缓存的存在,仍然会出现数据的非一致性的情况。我们把这种​​普通读``普通写​​可以理解为是有延迟的​​延迟读​​、​​延迟写​​,因此即使读在前、写在后,因为有延迟,然后仍然会出现写在前、读在后的情况。

    阅读全文
    标签:理解

    本文共计3724个文字,预计阅读时间需要15分钟。

    Java多线程中,如何准确理解内存屏障在内存读写中的作用?

    在现代计算机中,CPU通常都是多核的。每个CPU Core都有其自己的高速缓存Cache。因此,内存数据读写可能存在不一致性,导致指令乱序与不可见性问题。

    在现代计算机中,CPU往往都是多核的,而由于每个CPU Core中都有自己的高速缓存Cache,因此就会造成内存数据读写的不一致性,表现为​​指令乱序​​​与​​不可见性​​​问题。为此,java为了统一物理世界中的计算机组成架构,提出了JMM内存模型,并抽象了​​LoadLoad​​​,​​StoreStore​​​,​​LoadStore​​​,​​StoreLoad​​四个内存屏障指令来应对不同CPU的体系。本文先介绍下多核CPU体系下,并发编程需要克服的问题,然后再介绍下Java的内存屏障各自的含义,并举例说明对应的场景。

    顺序性与可见性

    在执行程序时,为了提高性能,编译器和处理器会通常对指令进行重排序,即:

  • 编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
  • 指令级并行的重排序。现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。 (同时,由于处理器中有缓存的存在,导致数据不一致,从读写操作上看,也存在类似的乱序重排的效果,即:内存系统的重排序)
  • 内存系统的重排序。由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。
  • 也就是说,即使指令的执行没有重排序,是按顺序执行的,但由于缓存的存在,仍然会出现数据的非一致性的情况。我们把这种​​普通读``普通写​​可以理解为是有延迟的​​延迟读​​、​​延迟写​​,因此即使读在前、写在后,因为有延迟,然后仍然会出现写在前、读在后的情况。

    阅读全文
    标签:理解