JMM的组成和它的作用

简介: JMM的组成和它的作用

JMM是一种抽象的概念,旨在定义程序中变量的访问规则,以及在并发的情况下如何和何时可以看到其他线程引起的变化,JMM是为了帮助开发者了解多线程程序的内存可见性,原子性,有序性问题

组成

1. 主内存与工作内存

  • 主内存(Main Memory):所有的变量都存储在主内存中,对所有线程来说是共享的。
  • 工作内存(Working Memory):每个线程都有自己的工作内存,其中包含了该线程用到的变量的主内存副本。

这种设计允许线程执行操作时,可以在自己的工作内存中快速读写,而不是直接在主内存中进行,提高了执行效率。但这也引入了内存可见性问题,因为一个线程对某个变量的修改,不一定立即对其他线程可见。

2. 内存交互操作

JMM定义了8种操作,用来完成线程之间的交互,确保内存的一致性和线程的协调工作,这些操作包括:

  • lock(锁定)/ unlock(解锁)
  • read(读取)/ load(载入)
  • use(使用)/ assign(赋值)
  • store(存储)/ write(写入)

这些操作必须按照特定的规则执行,以保证不同线程间的内存可见性、原子性和有序性。

3. happens-before原则

happens-before原则是JMM的基石,它定义了一个全局的顺序规则,这个规则决定了一个操作的结果对另一个操作可见的条件。如果一个操作A happens-before 另一个操作B,那么JMM保证A操作的结果对B操作是可见的。这个原则提供了一种判断数据是否安全发布和线程间通信是否正确的方式。

4. 同步原语

JMM通过一系列的同步原语(如synchronizedvolatilefinal和并发包中的工具)来实现内存的可见性、原子性和有序性。这些原语让开发者有能力编写出正确的多线程程序:

  • synchronized:可以确保同时只有一个线程可以执行同步代码段,并且在访问共享变量时提供内存可见性和互斥访问。
  • volatile:保证了变量的修改对所有线程立即可见,并禁止指令重排序。
  • final:用于声明常量,保证实例一旦构建完成,其他线程就能正确地看到由final字段构成的状态。
相关文章
|
5月前
|
Java 编译器 开发者
深入理解Java内存模型(JMM)及其对并发编程的影响
【9月更文挑战第37天】在Java的世界里,内存模型是隐藏在代码背后的守护者,它默默地协调着多线程环境下的数据一致性和可见性问题。本文将揭开Java内存模型的神秘面纱,带领读者探索其对并发编程实践的深远影响。通过深入浅出的方式,我们将了解内存模型的基本概念、工作原理以及如何在实际开发中正确应用这些知识,确保程序的正确性和高效性。
|
4月前
|
存储 Java 编译器
Java内存模型(JMM)深度解析####
本文深入探讨了Java内存模型(JMM)的工作原理,旨在帮助开发者理解多线程环境下并发编程的挑战与解决方案。通过剖析JVM如何管理线程间的数据可见性、原子性和有序性问题,本文将揭示synchronized关键字背后的机制,并介绍volatile关键字和final关键字在保证变量同步与不可变性方面的作用。同时,文章还将讨论现代Java并发工具类如java.util.concurrent包中的核心组件,以及它们如何简化高效并发程序的设计。无论你是初学者还是有经验的开发者,本文都将为你提供宝贵的见解,助你在Java并发编程领域更进一步。 ####
|
8月前
|
存储 安全 Java
Java面试题:深入探索Java内存模型,Java内存模型中的主内存与工作内存的概念,Java内存模型中的happens-before关系,volatile关键字在Java内存模型中的作用
Java面试题:深入探索Java内存模型,Java内存模型中的主内存与工作内存的概念,Java内存模型中的happens-before关系,volatile关键字在Java内存模型中的作用
54 1
|
7月前
|
存储 SQL 缓存
揭秘Java并发核心:深度剖析Java内存模型(JMM)与Volatile关键字的魔法底层,让你的多线程应用无懈可击
【8月更文挑战第4天】Java内存模型(JMM)是Java并发的核心,定义了多线程环境中变量的访问规则,确保原子性、可见性和有序性。JMM区分了主内存与工作内存,以提高性能但可能引入可见性问题。Volatile关键字确保变量的可见性和有序性,其作用于读写操作中插入内存屏障,避免缓存一致性问题。例如,在DCL单例模式中使用Volatile确保实例化过程的可见性。Volatile依赖内存屏障和缓存一致性协议,但不保证原子性,需与其他同步机制配合使用以构建安全的并发程序。
95 0
|
6月前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
8月前
|
安全 Java 开发者
Java面试题:Java内存模型解析,Java内存模型的基本概念和它的重要性,Java内存模型中的“可见性”和“有序性”,以及具体实现?
Java面试题:Java内存模型解析,Java内存模型的基本概念和它的重要性,Java内存模型中的“可见性”和“有序性”,以及具体实现?
87 1
|
8月前
|
存储 安全 Java
Java面试题:Java内存模型中的主内存与工作内存是如何协同工作的?请解释Java内存模型中的可见性、原子性和有序性,举例说明Java内存模型中的happens-before关系
Java面试题:Java内存模型中的主内存与工作内存是如何协同工作的?请解释Java内存模型中的可见性、原子性和有序性,举例说明Java内存模型中的happens-before关系
61 0
|
10月前
|
存储 缓存 安全
深入理解Java内存模型及其作用
深入理解Java内存模型及其作用
|
10月前
|
Java
6.什么是内存屏障?具有什么作用?
6.什么是内存屏障?具有什么作用?
119 0
6.什么是内存屏障?具有什么作用?
|
缓存 安全 Java
volatile底层的实现原理:volatile关键字的作用、内存模型、JMM规范和CPU指令
volatile底层的实现原理:volatile关键字的作用、内存模型、JMM规范和CPU指令
183 0

相关实验场景

更多