java并发编程学习笔记(3):java内存模型(JMM)

面试官:说说什么是 Java 内存模型(JMM)? 本文禁止转载 1. 为什么要有内存模型? 1.1. 硬件内存架构 1.2. 缓存一致性问题 1.3. 处理器优化和指令重排序 2. 并发编程的问题 3. Java 内存模型 3.1. Java 运行时内存区域与硬件内存的关系 3.2. Java 线程与主内存的关系 3.3. 线程间通信 4. 有态度的总结 在面试中,面试官经常喜欢问:『说说什么是Java内存模型(JMM)?』 面试者内心狂喜,这题刚背过:『Java内存主要分为五大块:堆、方法区、虚拟机栈、本地方法栈、PC寄存器,ba. 阅读详情

一、java内存模型(JMM)

1.JMM示意图

JMM是一种抽象的模型(实际是不存在的)
本地内存是JMM的一个抽象概念,并不真实存在。
如上图,有线程1和线程2。
(1)线程1、2的功能

  • 线程1 用来读取state。
  • 线程2 用来读取state -> 修改state -> 写回主内存。

(2)主内存、工作内存的作用

  • 主内存 用来存放共享信息。(若是基本数据类型,直接存放,若是引用类型,则引用的地址存放在工作内存,引用的对象存放在堆中)
  • 工作内存 用来存放私有信息(不同线程的工作内存之间相互不可见)。

(3)工作方式

  • 线程修改私有数据 :直接在工作内存修改。
  • 线程修改共享数据 :把新数值赋值到工作内存,再刷新到主内存

2.通过volatile对JMM的理解

public class javaDemo {
    volatile static boolean state = false;
    public static void main(String args[])throws InterruptedException{
        new Thread(new Runnable(){                      //线程1
            public void run(){
                System.out.println("等待数据");
                while(!state){
                }
                System.out.println("成功");
            }
        }).start();
        Thread.sleep(2000);

        new Thread(new Runnable() {                     //线程2
            public void run() {
                System.out.println("准备数据");
                state = true;
                System.out.println("准备数据完毕");
            }
        }).start();
    }
}

(1)当state的参数不用volatile修饰时,运行结果
在这里插入图片描述
对应到JMM中,此时线程1并不能使用更新过后的state,所以无法打印“成功”(线程1一直在while死循环中)。

(2)当state的参数使用volatile修饰时,运行结果
在这里插入图片描述
对应到JMM,中,根据缓存一致性协议。由于线程2修改了state。所以线程1的工作内存中的state失效。当线程1需要继续使用state时,需要重新从主内存中读取最新的state。所以,可以打印出“成功”。

二、为什么每个线程要设置单独的工作内存?

因为CPU的运行速度比主内存快得多。为了解决两者之间的读写速度矛盾(提高效率)。故在他们之间加入了高速缓存(相当于设置了一个工作内存)。

三、加入高速缓存带来的问题(缓存一致性)及解决办法

(1)缓存一致性问题
多线程并发处理的不同步。
(2)解决办法

  • 总线加锁(已过时,核心思想是将并行转换为串行)
    CPU从主内存读取数据到高速缓存,会在总线对这个数据加锁。这样其他CPU无法读写这个数据。直到该CPU使用完数据后才解锁。此时,解锁后其他CPU才能使用该数据。
  • MESI缓存一致性协议
    多个CPU从主内存读取同一个数据到各自的高速缓存,当其中某个CPU修改了该数据,那么该数据会立即(不会等线程其他代码执行完)同步会主内存。同时,其他CPU通过总线嗅探机制感知到数据的变化从而将自己的高速缓存中的数据失效(此时,需要再从主内存读数据,读取到的也就是新数据了)。

四、内存间交互操作

JMM定义了8个操作来完成 ***主内存***和***工作内存***的数据交互操作
在这里插入图片描述

数据原子操作功能
read(读取)从主内存读取数据
load(载入)将主内存读到的数据写入工作内存
use(使用)从工作内存读取数据来计算
assign(赋值)将计算好的值重新赋值到工作内存中
store(存储)将工作内存数据写入主内存
write(写入)将store过去的变量值赋值给主内存中的变量
lock(锁定)将主内存变量加锁,标识为线程独占状态
unlock(解锁)将主内存变量解锁,解锁后其他线程可以锁定该变量

五、JMM是如何保证并发编程的三大特性(原子性、可见性、有序性)

1.原子性的保证

操作是否具有原子性
x=1有(x为私有数据)写x(注:若x是私有数据有原子性,若是共享数据无原子性)
y=x无读x -> 写y
i++无读i -> +1 -> 写i

总结:

  1. 多个原子性的操作合并到一起没有原子性。
  2. JMM保证原子性,使用Synchronized和JUC中的lock关键字。

2.可见性的保证

  1. volatile关键字在JMM上实现MESI协议。
  2. Synchronized加锁。
  3. JUC的lock。

3.有序性的保证

Happens-before原则:

  1. 程序顺序原则:重排序后程序结果不变。
  2. 锁定原则:后一次加锁必须等待前一次解锁。
  3. volatile原则:不允许变化(霸道原则)。
  4. 传递原则:A->B->C ,则A->C。
【Java并发编程】8.说点JMM 让你的面试锦上添花 一个指令0.5ns, 读写copy 延时 https://blog.youkuaiyun.com/qq_36894974/article/details/104750989 高速缓存,寄存器等 阅读详情

相关推荐

如何利用GMS构建地下水数值模拟模型?

第一步:点图中三维网格的图标然后点Grid→Create Grid这个界面是用于创建一个有限差分网格的设置窗口。它允许你定义网格在三维空间中的范围、分辨率以及其他相关属性。这个界面提供了一个直观的方式来定义一个三维的有限差分网格,你需要指定每个维度上的范围、划分的单元格数量,以及一些控制单元格大小分布和网格方向的参数。这个网格通常会被用于数值模拟,例如地下水流模拟。在点击 "OK" 之前,请务必仔细检查所有参数是否符合你的建模需求。1. X-Dimension (X 轴维度)2. Y-Dimension (

weixin_44259522的博客 2091

JMM内存模型

Java内存模型即Java Memory Model,简称JMM。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。 如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。原始的Java内存模型效率并不是很理想,

lxm55913153的博客 1万+

2025年一篇解决Windows11安装医学图像处理工具-FSL(各种问题解决,过程详细,小白轻松安装)

2025年一篇帮你解决FSl安装所有问题,包括环境安装、使用说明、常见问题,过程简单易懂,小白轻松安装。

weixin_52145255的博客 2517

java内存模型JMM

java内存模型 jmm(java memory model)规范,他规范了java虚拟机与计算机内存如何协调工作 ,他规定了一个线程如何及何时看到其他线程修改过的变量的值,以及在必须时,如何同步的访问共享变量。 jmm内存分配的概念: 堆heap: 优点:运行时数据区,动态分配内存大小,有gc;,缺点:因为要在运行时动态分配,所以存取速度慢,对象存储在堆上,静态类型的变量跟着类的定义一起存储在...

坚定目标,超越自我 2万+

利用python爬取东方财富网股吧评论并进行情感分析(一)

利用python爬取东方财富网股吧评论(一) python-东方财富网贴吧文本数据爬取 分享一下写论文时爬数据用到的代码,有什么问题或者改善的建议的话小伙伴们一起评论区讨论。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示; 增加了 图片拖拽 功能,你可以将本地的图片直

YMG521000的博客 1万+

【Matlab深度学习】GPU加速实战:从环境配置到性能优化

本文详细介绍了如何在Matlab中为深度学习任务配置GPU加速环境并进行性能优化。文章从GPU加速的必要性讲起,手把手指导安装NVIDIA驱动、CUDA和cuDNN核心三件套,并验证环境。重点讲解了如何利用gpuArray将数据和模型迁移至GPU,以及通过内存优化、计算优化和多GPU并行等策略充分释放GPU算力,大幅缩短深度学习模型的训练时间。

weixin_29061465的博客 490

【Java内存模型】Java内存模型(JMM)详解以及并发编程的三个重要特性(原子性,可见性,有序性)

目录 1 Java内存模型(Java memory model JMM) 1.1 什么是JMM(JMM的作用) 1.2 JMM的组成 2 硬件内存架构与java内存模型 2.1 硬件架构 2.2 Java线程与硬件处理器 2.3 Java内存模型与硬件内存架构的关系 2.4 Java内存模型的必要性 3.并发编程的三个重要特性 3.1 原子性 3.2 可见性 3.3...

小七的博客 5743

通讯软件002——快速使用modscan进行modbus调试

快速使用modscan进行modbus调试

zhouwl72的博客 1031

Java内存模型(JMM)详解

为什么要有内存模型 在现代多核处理器中,每个处理器都有自己的缓存,定期的与主内存进行协调。 想要确保每个处理器在任意时刻知道其他处理器正在进行的工作,将需要很大的开销,且通常是没必要的。 硬件的效率与一致性 由于计算机的存储设备与处理器的运算能力之间有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(cache)来作为内存与处理器之间的缓冲:将运算...

牧小农 4510

廉价却有效?ESD防护中的电容

摘要:在成本敏感型电子产品设计中,多层陶瓷电容(MLCC)可作为TVS二极管的替代方案用于静电放电(ESD)防护。其工作原理是通过电容充放电特性吸收静电能量,而非电压钳位。计算表明100nF/50V MLCC可有效缓冲8kV静电冲击,但存在吸收能量有限、无自恢复等局限。建议将MLCC作为一级缓冲措施,配合TVS等器件形成多级防护,并优先选择X7R材质、100nF容值、50V耐压的0402/0603封装MLCC。该方案在低速信号和电源引脚防护中具有显著成本优势,但不能完全替代专业ESD抑制器。

硬核科技 430

Transformer实战(39)——多模态生成式Transformer

能够理解多种类型输入的模型被称为多模态模型。多模态学习是人工智能 (Artificial Intelligence, AI) 领域的重要研究方向之一,长期受到众多研究人员的关注。本节将介绍使用多模态模型的生成式 AI,包括文本到图像 (text-to-image) 和文本到音乐 (text-to-music) 的生成模型。将介绍 Stable Diffusion 及其工作原理,同时也将介绍 MusicGen 和 AudioGen 模型。

盼小辉丶的博客 2400

JMM(Java内存模型)详解

内存屏障,也称为内存栅栏(Memory Fence),是一种用于防止指令重排序的机制。它是CPU指令或JVM指令,用于在多线程编程中保证某些操作的顺序性和内存可见性。

weixin_61669379的博客 3361

CATIA二次开发一一一装配体与零件之间的坐标转换

输入参数:Product(产品实例对象)、iPointToTransfor(待转换坐标点CATMathPoint)核心逻辑:通过产品对象的绝对位置变换矩阵,计算逆向变换实现坐标系转换。输出参数:Point(转换后的局部坐标点CATMathPoint)

工业软件开发 1128

Java内存模型(JMM)详解

Java内存模型(Java Memory Model简称JMM)是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。

EverythingAtOnce的博客 1995

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【JVM】JMM内存模型

文章目录JVM-内存模型1. 原子性1-1 问题解析1-2 解决方法(1)synchronized(同步关键字)2.可见性2-1 退不出的循环2-2 解决办法(1)volatile(易变关键字)3.有序性3-1 诡异的结果3-2 解决方法3-3 有序性理解3-4 happens-before4.CAS与原子类4-1 CAS4-2 乐观锁与悲观锁4-3 原子操作类5.synchronized 优化5-1 轻量级锁5-2 锁膨胀5-3 重量锁5-4 偏向锁5-5 其他优化(1)减少上锁时间(2)减少锁的粒度(

小皮皮LL的博客 2741

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java 内存模型(JMM)

在面试中,Java 内存模型(Java Memory Model, JMM)是一个常见且重要的主题。然而,很多开发者容易将 JMM 与 Java 运行时内存区域混淆。本文将详细解释 JMM 的概念,并对比它与 Java 运行时内存区域的区别。

专注Java和MySQL领域知识分享 1055

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【JMM】--Java内存模型

Java内存模型即Java Memory Model,简称JMM。 JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。 如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。原始的Java内存模型效率并不是很理想,因此Java1.5版本对其进行了重构,现在的Java8仍沿用了Java1.5的版本。 并发编程模型的分类 在并发编程

fu-jw的博客 5295

Java 内存模型(JMM)探寻原理,深度讲解

网上有很多关于 Java 内存模型的文章,在《深入理解Java虚拟机》和《Java并发编程的艺术》等书中也都有关于这个知识点的介绍。但是,很多人读完之后还是搞不清楚,甚至有的人说自己更懵了。本文,就来整体的介绍一下 Java 内存模型,目的很简单,让你读完本文以后,就知道到底Java 内存模型是什么,为什么要有 Java 内存模型,Java 内存模型解决了什么问题等。

流华追梦的专栏 2429

Java内存模型(JMM)深度解析

Java内存模型(JMM)是Java并发编程的核心规范,定义了多线程环境下变量访问规则和线程交互机制。JMM采用主内存与线程工作内存的抽象模型,通过8种原子操作控制内存交互,并建立happens-before原则保证操作顺序性。文章详细解析了内存屏障的实现差异、final字段的特殊规则、双重检查锁定的解决方案,以及JMM与硬件内存模型的关系。同时提供了可见性问题、指令重排序等常见并发问题的分析,并给出安全发布模式和性能优化建议。理解JMM是编写正确高效并发程序的关键,它既保证了线程安全,又为JVM优化提供了

weixin_47242663的博客 1271

揭秘Java内存模型(JMM)

简单来说,Java内存模型(JMM)是Java虚拟机(JVM)规范中定义的一种。

guangzhi0633的专栏 1121

【JUC并发编程】Java内存模型——JMM

【JUC并发编程】Java内存模型——JMM

blblccc 840

学习日志:JMM(Java 内存模型)

JMM(Java 内存模型)主要定义了对于一个共享变量,当另一个线程对这个共享变量执行写操作后,这个线程对这个共享变量的可见性。要想理解透彻 JMM(Java 内存模型),我们先要从CPU 缓存模型和指令重排序说起!ava 是最早尝试提供内存模型的语言,其主要目的是为了简化多线程编程,增强程序可移植性的。CPU 可以通过制定缓存一致协议(比如 MESI协议open in new window)来解决内存缓存不一致性问题。为了提升执行速度/性能,计算机在执行程序代码的时候,会对指令进行重排序。

weixin_46117680的博客 1139

深入解析JMM:Java内存模型与并发编程

主内存(Main Memory)定义:在JMM中,主内存是所有线程共享的内存区域存储内容:存储所有的共享变量(实例字段、静态字段等),约等于JVM堆中真正被多线程共享的部分 + 方法区的静态变量,或者是计算机中的内存(注意内存和外存的区别)特点:1.线程对共享变量的所有操作(读/写)都必须在主内存中进行2.是线程间通信的媒介3.对应于物理内存,但不等同于JVM堆内存工作内存(Working Memory)定义:每个线程私有的内存区域存储内容:存储该线程使用到的变量的主内存副本,约等于。

FQY__的博客 934

Java 内存模型 JMM

Java 内存模型 JMM

26857259 1606

Java多线程系列——内存模型JMM

Java多线程

飞影铠甲的博客 1102
上一篇: leetcode刷题笔记(简单篇):101&104
下一篇: 左神算法学习笔记基础篇(7):哈希函数
光脚小孩
博客等级 码龄8年 27粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值