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字段构成的状态。
相关文章
|
前端开发 JavaScript
【经典】全局公共scss文件的引入使用
【经典】全局公共scss文件的引入使用
|
前端开发
element菜单组件样式修改NavMenu导航菜单
本文介绍了如何修改Element UI的NavMenu导航菜单组件的样式,包括激活菜单项的颜色、菜单项hover颜色、父级菜单hover颜色以及菜单行高。提供了相应的CSS代码示例,并展示了如何将这些样式应用到实际的NavMenu组件中。
1161 3
element菜单组件样式修改NavMenu导航菜单
|
11月前
|
文件存储
Unicode标准与其他编码规则
Unicode标准与其他编码规则
133 0
|
存储 缓存 Java
深入理解JMM
深入理解JMM
948 2
|
JavaScript
error Component name “Login“ should always be multi-word vue/multi-word-component-names【已解决】
error Component name “Login“ should always be multi-word vue/multi-word-component-names【已解决】
1031 1
el-dialog使用::v-deep()穿透设置样式不生效,解决办法亲测有效!
el-dialog使用::v-deep()穿透设置样式不生效,解决办法亲测有效!
|
存储 人工智能 安全
阿里云oss简介和如何对接使用
阿里云对象存储服务(Alibaba Cloud Object Storage Service,简称OSS)是阿里云提供的一种安全、稳定、高效的对象存储服务。它支持多元数据存储、持久化存储和共享访问,并且具有无限的扩展性和备份恢复能力。阿里云OSS适用于各类场景,如云计算、大数据分析、人工智能等,并且具备高可用性、高可扩展性和低成本等优势。
13546 2
|
Java Windows
Jmeter安装配置详细教程
Jmeter安装配置详细教程
468 0
Jmeter安装配置详细教程
|
存储 C语言
C语言数据结构篇——用栈实现四则运算
C语言数据结构篇——用栈实现四则运算
864 0
C语言数据结构篇——用栈实现四则运算