当前位置: 首页 > news >正文

你真的了解Java内存模型JMM吗?

面试官

哈喽,大家好🎉,我是世杰

本文我为大家介绍面试官经常考察的**「Java内存模型JMM相关内容」**

面试连环call

  1. 什么是Java内存模型(JMM)? 为什么需要JMM?
  2. Java线程的工作内存和主内存各自的作用?
  3. Java缓存一致性问题?
  4. Java的并发编程问题?

要想理解透彻 JMM(Java 内存模型),我们先要从 『硬件内存结构』 说起。让我们开始吧!🎉🎉🎉

1. 硬件内存结构

1.1 CPU 缓存模型

img

(1)CPU Register

CPU Register 也就是 CPU 寄存器。CPU 寄存器是 CPU 内部集成的,在寄存器上执行操作的效率要比在主存上高出几个数量级。

(2)CPU Cache Memory

CPU Cache Memory 也就是 CPU 高速缓存,相对于寄存器来说,通常也可以成为 L2 二级缓存。相对于硬盘读取速度来说内存读取的效率非常高,但是与 CPU 还是相差数量级,所以在 CPU 和主存间引入了多级缓存。CPU 缓存则是为了解决 CPU 处理速度和内存处理速度不对等的问题。

(3)Main Memory

Main Memory 就是主存,主存比 L1、L2 缓存要大很多。

1.2 缓存一致性问题

由于主存与 CPU 处理器的运算能力之间有数量级的差距,所以在传统计算机内存架构中会引入高速缓存来作为主存和处理器之间的缓冲。先复制一份数据到 CPU Cache 中,当 CPU 需要用到的时候就可以直接从 CPU Cache 中读取数据,当运算完成后,再将运算得到的数据写回 Main Memory 中。

但是,这样存在 内存缓存不一致性的问题 !比如我执行一个 i++ 操作的话,如果两个线程同时执行的话,假设两个线程从 CPU Cache 中读取的 i=1,两个线程做了 i++ 运算完之后再写回 Main Memory 之后 i=2,而正确结果应该是 i=3。

CPU 为了解决内存缓存不一致性问题可以通过**制定缓存一致协议(比如 [MESI 协议open in new window])**或者其他手段来解决。 这个缓存一致性协议指的是在 CPU 高速缓存与主内存交互的时候需要遵守的原则和规范。不同的 CPU 中,使用的缓存一致性协议通常也会有所不同。

img

1.3 指令重排序

什么是指令重排序? 简单来说就是系统在执行代码的时候并不一定是按照你写的代码的顺序依次执行。

常见的指令重排序有下面 2 种情况:

  • 编译器优化重排:编译器(包括 JVM、JIT 编译器等)在不改变单线程程序语义的前提下,重新安排语句的执行顺序。
  • 指令并行重排:现代处理器采用了指令级并行技术(Instruction-Level Parallelism,ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
  • 内存系统的重排序:由于处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。

img

Java 源代码会经历 编译器优化重排 —> 指令并行重排 —> 内存系统重排 的过程,最终才变成操作系统可执行的指令序列。


2. Java内存模型

2.1 Java内存与硬件内存

之前讲 JVM 运行时内存区域时,聊到 JVM 分为栈、堆等,这些都是 JVM 定义的概念。在传统的硬件内存架构中是没有栈和堆这种概念。从图中可以看出栈和堆既存在于高速缓存中又存在于主内存中,所以Java内存和硬件内存没有直接的关系。

img

2.2 Java内存与主内存

(1) Java 内存模型规定所有的变量都存储在主内存中,每条线程都有自己的工作内存。

(2) 线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。

(3) 不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递都需要通过主内存来完成。

jmm

  • 主内存:所有线程创建的实例对象都存放在主内存中,不管该实例对象是成员变量,还是局部变量类信息常量静态变量都是放在主内存中。为了获取更好的运行速度,虚拟机及硬件系统可能会让工作内存优先存储于寄存器和高速缓存中。

  • 本地内存:每个线程都有一个私有的本地内存,本地内存存储了该线程以读 / 写共享变量的副本。每个线程只能操作自己本地内存中的变量,无法直接访问其他线程的本地内存。如果线程间需要通信,必须通过主内存来进行。本地内存是 JMM 抽象出来的一个概念,并不真实存在,它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。

为了更好的控制主内存和本地内存的交互,Java 内存模型定义了八种操作来实现:

『主内存』

  • lock:锁定。作用于主内存的变量,把一个变量标识为一条线程独占状态

  • unlock:解锁。作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定

  • read:读取。作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用

  • write:写入。作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中

『工作内存』

  • load:载入。作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中

  • use:使用。作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作

  • assign:赋值。作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作

  • store:存储。作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作


3. 再聊并发编程

熟悉 Java 并发编程的同学肯定对这三个问题很熟悉:『可见性问题』『原子性问题』『有序性问题』

3.1 有序性

由于指令重排序问题,代码的执行顺序未必就是编写代码时候的顺序。我们上面讲重排序的时候也提到过:指令重排序可以保证串行语义一致,但是没有义务保证多线程间的语义也一致 ,所以在多线程下,指令重排序可能会导致一些问题。

在 Java 中,volatile 关键字可以禁止指令进行重排序优化。

3.2 原子性

一次操作或者多次操作,要么所有的操作全部都得到执行并且不会受到任何因素的干扰而中断,要么都不执行

在 Java 中,可以借助synchronized、各种 Lock 以及各种原子类实现原子性。

3.3 可见性

当一个线程对共享变量进行了修改,那么另外的线程都是立即可以看到修改后的最新值。

在 Java 中,可以借助synchronizedvolatile 以及各种 Lock 实现可见性。


参考文章

  1. Java 内存模型引入

  2. JMM(Java 内存模型)详解

  3. 说说什么是Java内存模型?

  4. 从 CPU 讲起,深入理解 Java 内存模型!


更多惊喜

我还将定期分享:

  • 最新互联网资讯:让你时刻掌握行业动态。

  • AI前沿新闻:紧跟技术潮流,不断提升自我。

  • 技术分享与职业发展:助你在职业生涯中走得更远、更稳。

  • 程序员生活趣事:让你在忙碌的工作之余找到共鸣与乐趣。

关注回复【1024】惊喜等你来拿!

点击查看惊喜

敬请关注【程序员世杰】

点击关注程序员世杰

相关文章:

你真的了解Java内存模型JMM吗?

哈喽,大家好🎉,我是世杰。 本文我为大家介绍面试官经常考察的**「Java内存模型JMM相关内容」** 面试连环call 什么是Java内存模型(JMM)? 为什么需要JMM?Java线程的工作内存和主内存各自的作用?Java缓存一致性问题?Java的并发编程问题? …...

Springboot整合Jsch-Sftp

背景 开发一个基于jsch的sftp工具类&#xff0c;方便在以后的项目中使用。写代码的过程记录下来&#xff0c;作为备忘录。。。 Maven依赖 springboot依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-par…...

生成随机的验证码图片(Python)

文章目录 一、导入包二、生成随机的验证码三、生成随机的rgb颜色四、生成图片验证码总结&#xff1a; 一、导入包 import random from PIL import Image, ImageDraw, ImageFont二、生成随机的验证码 def random_code(length4):默认返回4位随机验证码&#xff0c;字符串code …...

0/1背包问题总结

文章目录 &#x1f347;什么是0/1背包问题&#xff1f;&#x1f348;例题&#x1f349;1.分割等和子集&#x1f349;2.目标和&#x1f349;3.最后一块石头的重量Ⅱ &#x1f34a;总结 博客主页&#xff1a;lyyyyrics &#x1f347;什么是0/1背包问题&#xff1f; 0/1背包问题是…...

模电基础 - 放大电路的频率响应

目录 一. 简介 二. 频率响应的基本概念 三. 波特图 四. 晶体管的高频等效模型 五. 场效应管的高频等效模型 六. 单管放大电路的频率响应 七.多级放大电路的频率响应 八. 频率响应与阶跃响应 一. 简介 放大电路的频率响应是指在输入不同频率的正弦信号时&#xff0c;电路…...

Java 8 到 Java 22 新特性详解

Java 8 到 Java 22 新特性详解 Java自发布以来一直在不断演进&#xff0c;添加新特性以提升开发效率和性能。本文将介绍Java 8到Java 22的主要新特性&#xff0c;帮助开发者了解各版本的新功能和改进。 Java 8 (2014) 1. Lambda 表达式 Lambda 表达式允许使用简洁的语法定义…...

华为OD机试题-提取字符串中最长数学表达式

题目描述 https://blog.csdn.net/weixin_51055612/article/details/139841128 题目描述 提取字符串中的最长合法简单数学表达式&#xff0c;字符串长度最长的&#xff0c;并计算表达式的值。如果没有&#xff0c;则返回0。 简单数学表达式只能包含以下内容&#xff1a;0-9数字&…...

专家指南:如何为您的电路选择理想的压敏电阻或热敏电阻

保护和维持电路功能需要两种设备&#xff1a;压敏电阻和热敏电阻。这两个电气元件有时会因后缀相似而混淆&#xff0c;但它们具有不同且重要的用途。 由于这种混淆&#xff0c;我们需要准确地了解这些组件是什么&#xff0c;这就是本文将要讨论的内容——应用程序、作用、优点…...

基于主流SpringBoot进行JavaWeb开发的学习路线

目录 一、学习路线 &#xff08;1&#xff09;第一部分&#xff08;Web前端开发的技术栈&#xff09; &#xff08;2&#xff09;第二部分&#xff08;Web后端开发&#xff09; 二、学习之后必备的技能 三、学习Web开发的基础与未来的收获 学完这一类知识目标&#xff1a;…...

医疗机器人中的具身智能进展——自主超声策略模型的任务编码和局部探索

医疗机器人一直是具身智能的研究热点。医学图像、医疗触诊、血压血氧、心率脉搏和生物电信号等多模态生物医学信息&#xff0c;不断丰富着医疗机器人的感知范畴。 自主超声 “自主超声”属于具身智能医疗机器人领域中话题度较高的研究方向。作为临床检查的重要手段之一&#…...

探索人工智能在电子商务平台与游戏发行商竞争中几种应用方式

过去 12 年来&#xff0c;电脑和视频游戏的发行策略发生了巨大变化。数字游戏的销量首次超过实体游戏的销量 在20132020 年的封锁进一步加速了这一趋势。例如&#xff0c;在意大利&#xff0c;封锁的第一周导致数字游戏下载量 暴涨174.9%. 展望未来&#xff0c;市场有望继续增…...

【Altium】AD-网络版一个用户非人为异常占用多个License的解决方法

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 当出现一个用户同时占用多个授权&#xff0c;又无法单独释放一个授权的情况下&#xff0c;该如何解决。 2、 问题场景 一个用户获取网络版授权后&#xff0c;AD会自动重复获取授权&#xff0c;直到该license下所有授…...

*算法训练(leetcode)第二十五天 | 134. 加油站、135. 分发糖果、860. 柠檬水找零、406. 根据身高重建队列

刷题记录 134. 加油站135. 分发糖果860. 柠檬水找零406. 根据身高重建队列 134. 加油站 leetcode题目地址 记录全局剩余油量和当前剩余油量&#xff0c;当前剩余小于0时&#xff0c;其实位置是当前位置的后一个位置。若全局剩余油量为负&#xff0c;则说明整体油量不足以走完…...

乐鑫ESPC3 ESP8685 WiFi蓝牙模块透传程序设置教程,抛开繁琐AT指令,简单Web页面配置,即可实现透传

完整文档请下载规格书 TTL-WiFi 透传产品 使用手册 一. 产品概述 二. 接口定义 三. 软件透传WEB配置使用说明 3.1 STATUS配置界面 3.2 MODULE配置界面 n Serial&#xff08;串口配置&#xff09; n WiFi&#xff08;WiFi配置&#xff09; n Networks&#xff08;网络…...

怎么样才能为公司申请OV证书?

OV证书&#xff0c;全称为组织验证型SSL证书&#xff08;Organization Validation SSL Certificate&#xff09;&#xff0c;是一种高级别的SSL/TLS证书&#xff0c;用于加密网站通信并验证网站所属组织的合法身份。相比于基本的域名验证型证书&#xff08;DV证书&#xff09;&…...

Python的`queue`模块

队列&#xff08;Queue&#xff09; 在Python的queue模块中&#xff0c;Queue类是一个线程安全的队列实现&#xff0c;用于在多线程编程中安全地交换信息。它遵循先入先出&#xff08;FIFO&#xff09;的原则。Queue类提供了几种主要的方法&#xff1a; put(item): 将一个项目…...

牛客周赛 Round 50

A题&#xff1a;小红的最小最大 思路&#xff1a; 大水题 code&#xff1a; inline void solve() {int a, b, c; cin >> a >> b >> c;if (min(a, b) c > max(a, b)) cout << "YES\n";else cout << "NO\n";return; }…...

后端之路——登录校验

前言&#xff1a;Servlet 【登录校验】这个功能技术的基础是【会话技术】&#xff0c;那么在讲【会话技术】的时候必然要谈到【Cookie】和【Session】这两个东西&#xff0c;那么在这之前必须要先讲一下一个很重要但是很多人都会忽略的一个知识点&#xff1a;【Servlet】 什么是…...

无线网卡怎么连接台式电脑?让上网更便捷!

随着无线网络的普及&#xff0c;越来越多的台式电脑用户希望通过无线网卡连接到互联网。无线网卡为台式电脑提供了无线连接的便利性&#xff0c;避免了有线网络的束缚。本文将详细介绍无线网卡怎么连接台式电脑的四种方法&#xff0c;包括使用USB无线网卡、内置无线网卡以及使用…...

【45 Pandas+Pyecharts | 去哪儿海南旅游攻略数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 日期处理&#xff0c;提取年份、月份2.4 经费处理2.5 天数处理 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 出发日期_…...

炉石传说自动化工具:从效率提升到策略优化的全栈解决方案

炉石传说自动化工具&#xff1a;从效率提升到策略优化的全栈解决方案 【免费下载链接】Hearthstone-Script Hearthstone script&#xff08;炉石传说脚本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 问题引入&#xff1a;重构游戏体验…...

PyTorch升级1.10.1后GPU失效?3分钟搞定CUDA环境回滚(以Colab对比为例)

PyTorch 1.10.1 GPU失效排查与CUDA环境精准回滚指南 当你满心欢喜地升级到PyTorch最新版本1.10.1&#xff0c;准备继续你的深度学习项目时&#xff0c;突然发现GPU无法正常工作——这种"昨天还能用&#xff0c;今天突然报错"的场景让许多开发者抓狂。本文将带你深入分…...

Phi-4-mini-reasoning助力Web前端开发:智能UI组件设计与代码生成

Phi-4-mini-reasoning助力Web前端开发&#xff1a;智能UI组件设计与代码生成 1. 引言&#xff1a;当AI遇见前端开发 想象一下这样的场景&#xff1a;产品经理拿着一份复杂的需求文档找到你&#xff0c;描述了一个需要实时数据更新、多状态切换、动态交互的仪表盘界面。传统开…...

开源大模型效果展示:Pixel Language Portal对emoji+文字混合输入的语义解析

开源大模型效果展示&#xff1a;Pixel Language Portal对emoji文字混合输入的语义解析 1. 项目概览 Pixel Language Portal&#xff08;像素语言跨维传送门&#xff09;是一款基于Tencent Hunyuan-MT-7B大模型构建的创新翻译工具。与传统翻译软件不同&#xff0c;它将语言转换…...

GameFramework——FileSystem篇

目录 一、快速入门 1.1 什么是文件系统模块&#xff1f; 1.2 基本使用步骤 1.2.1 创建文件系统 1.2.2 写入文件 1.2.3 读取文件 1.2.4 删除文件 1.2.5 加载已有文件系统 二、文件布局 2.1 HeaderData&#xff08;文件头&#xff09; 2.2 BlockData&#xff08;块数据…...

如祺出行2025年营收53亿:网约车贡献97%收入 净亏2.9亿

雷递网 乐天 4月1日如祺出行科技有限公司&#xff08;股份代号&#xff1a;9680&#xff09;日前发布截至2025年12月31日的财报。财报显示&#xff0c;如祺出行2025年营收为52.86亿元&#xff0c;较上年同期的24.63亿元增长114.6%。如祺出行收入主要来自网约车服务&#xff0c;…...

JAVA重点基础、进阶知识及易错点总结(14)字节流 字符流

&#x1f680; Java 巩固进阶 第14天 主题&#xff1a;字节流 & 字符流 —— 文件读写的核心引擎&#x1f4c5; 进度概览&#xff1a;今天进入 IO 流的灵魂章节&#xff01;掌握这 4 个核心类&#xff0c;你就能打通文件读写的任督二脉。 &#x1f4a1; 核心价值&#xff…...

《B3845 [GESP样题 二级] 勾股数》

题目背景 对应的选择、判断题&#xff1a;https://ti.luogu.com.cn/problemset/1102 题目描述 勾股数是很有趣的数学概念。如果三个正整数 a,b,c&#xff0c;满足 a2b2c2&#xff0c;而且 1≤a≤b≤c&#xff0c;我们就将 a,b,c 组成的三元组 (a,b,c) 称为勾股数。你能通过编…...

2026降AIGC率工具实测:10款好用工具推荐(论文AI痕迹重必看)

临近毕业季&#xff0c;不少同学都在为论文的AIGC检测头疼&#xff1a;明明是自己写的内容&#xff0c;却被判定为AI生成&#xff1f;用AI搭了初稿&#xff0c;怎么改都消不掉机器痕迹&#xff1f;到底有没有靠谱的降AI率工具能真正解决问题&#xff1f; 今天我就给大家整理了1…...

老马失前蹄,竟然在数据库外键上翻车了,重温外键级联

一、什么是setuptools&#xff1f; setuptools 是一个用于创建、分发和安装 Python 包的核心库。 它可以帮助你&#xff1a; 定义 Python 包的元数据&#xff08;如名称、版本、作者等&#xff09;。 声明包的依赖项&#xff0c;确保你的包能够正确运行。 构建源代码分发包&…...