什么是JMM

JMM 是 Java 内存模型(Java Memory Model)的缩写。 它是一种抽象的概念,并非实际存在的内存结构,而是 Java 虚拟机(JVM)规范的一部分,用于描述 Java 程序中线程与内存之间的交互关系。 更具体地说,JMM 定义了共享变量的可见性、原子性和有序性,以及程序中各种操作之间的 happens-before 关系。

核心作用:解决并发编程中的可见性、原子性和有序性问题

在多线程并发编程中,由于 CPU 缓存、编译器优化和指令重排序等因素的影响,可能会导致以下问题:

  • 可见性 (Visibility): 一个线程修改了共享变量的值,其他线程可能无法立即看到修改后的值。
  • 原子性 (Atomicity): 一个操作看似是一个整体,但在多线程环境下可能会被中断,导致结果出错。
  • 有序性 (Ordering): 程序代码的执行顺序可能与代码编写的顺序不一致,从而导致意想不到的结果。

JMM 的主要目标就是解决这些问题,为并发编程提供可靠的保证。

JMM 的主要组成部分:

  1. 主内存 (Main Memory): 所有线程共享的内存区域,存储着所有变量的实例。 在物理上,主内存可能对应着计算机的主存的一部分。

  2. 工作内存 (Working Memory): 每个线程都有自己的工作内存,存储着该线程使用的变量的副本。线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。 工作内存是 JMM 的核心概念,也是导致可见性问题的根源。 在物理上,工作内存可能对应着 CPU 的高速缓存和寄存器。

  3. 抽象的交互操作: JMM 定义了线程和主内存之间的抽象关系,一个线程要访问共享变量,需要执行以下步骤:

    • lock: 作用于主内存的变量,它把一个变量标识为一条线程独占的状态
    • unlock: 作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
    • read: 作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用
    • load: 作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中
    • use: 作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个动作
    • assign: 作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个需要将一个变量的值赋值的字节码指令时执行这个操作
    • store: 作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便随后的write操作使用
    • write: 作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中

    这些操作必须满足一些规则,例如:不允许一个线程从主内存中读取没有执行load操作的变量,不允许将没有经过assign操作的变量写回主内存。

JMM 的关键概念:

  • happens-before 关系: JMM 定义了一组 happens-before 关系,用于描述两个操作之间的可见性。 如果操作 A happens-before 操作 B,则 JVM 保证操作 A 的结果对操作 B 可见。 happens-before 关系并不意味着操作 A 必须在操作 B 之前执行,而是指操作 A 的结果必须在操作 B 之前对 B 可见。 常见的 happens-before 关系包括:

    • 程序顺序规则 (Program Order Rule): 在同一个线程中,按照程序代码的执行顺序,排在前面的操作 happens-before 于排在后面的操作。
    • 管程锁定规则 (Monitor Lock Rule): 对一个锁的解锁 happens-before 于随后对这个锁的加锁。
    • volatile 变量规则 (Volatile Variable Rule): 对一个 volatile 变量的写操作 happens-before 于随后对这个变量的读操作。
    • 线程启动规则 (Thread Start Rule): Thread 对象的 start() 方法 happens-before 于该线程中的任何动作。
    • 线程终止规则 (Thread Termination Rule): 线程中的所有操作 happens-before 于对此线程的终止检测。
    • 传递性 (Transitivity): 如果 A happens-before B,B happens-before C,那么 A happens-before C。
  • 内存屏障 (Memory Barrier): 是一种 CPU 指令,用于强制 CPU 将缓存中的数据刷新到主内存,或者从主内存中读取数据。 JMM 通过在适当的位置插入内存屏障来保证 happens-before 关系。

如何理解 JMM?

可以把 JMM 看作是 Java 并发编程的基石。 它定义了一组规则,保证了多线程并发访问共享变量时的正确性。

总结:

JMM (Java Memory Model) 是一种规范,定义了 Java 程序中线程与内存之间的交互关系,主要解决并发编程中的可见性、原子性和有序性问题。 它包括主内存、工作内存和 happens-before 关系等关键概念。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值