学习笔记04——JMM内存模型
一、Java内存模型(JMM)是什么?
Java内存模型(Java Memory Model, JMM)是Java多线程编程中共享内存的访问规则,定义了线程如何与主内存(Main Memory)和工作内存(Work Memory)交互,解决多线程并发中的原子性、可见性、有序性问题。确保多线程程序在不同架构的处理器和内存系统上都能正确运行。
二、核心概念
-
主内存与工作内存
-
主内存:所有线程共享的内存区域,存储变量(实例字段、静态字段等),类似于计算机中的物理内存。
-
工作内存:每个线程私有的内存区域,存储主内存变量的副本。
-
交互规则:线程只能操作工作内存中的变量副本,修改后需同步回主内存。
-
-
原子性、可见性、有序性
-
原子性:操作不可分割(如
AtomicInteger),要不全部完成,要不全部不做。-
基本数据类型的赋值操作(如int a = 10)。
-
使用synchronized关键字或Lock接口实现的同步代码块。
public class Counter {private int count = 0; public synchronized void increment() {count++;} }
-
-
可见性:一个线程对变量的修改能被其他线程立刻看到(
volatile、synchronized)。-
volatile关键字:确保变量的修改立即刷新到主内存,其他线程读取时能获取最新值。
-
synchronized关键字:线程退出同步块时,会将工作内存中的变量写回主内存。
public class VolatileExample {private volatile boolean running = true; public void stop() {running = false;} public void run() {while (running) {// do something}} }
-
-
有序性:代码执行顺序与程序顺序一致(防止指令重排序)。
-
happens-before原则:定义了操作的先后顺序。
-
内存屏障:防止指令重排序。
-
-
-
Happens-Before原则 JMM定义的保证有序性的规则,若操作A happens-before 操作B,则A的结果对B可见。 常见规则:
-
程序顺序规则 :在单线程中,代码的执行顺序符合书写顺序。
-
volatile变量规则 -
锁规则(
synchronized或Lock) -
线程启动/终止规则
-
传递性规则
-
三、关键机制
-
volatile关键字
-
保证变量的可见性:直接读写主内存,禁止缓存。
-
禁止指令重排序:通过插入内存屏障(Memory Barrier)。
-
示例:双检锁单例模式中的
volatile修饰实例对象。
-
-
synchronized与锁
-
通过监视器锁(Monitor)实现原子性和可见性。
-
线程解锁前必须将变量同步回主内存。
-
-
final关键字
-
构造函数中对
final域的写入,与后续引用赋值操作不会被重排序。 -
确保其他线程看到
final变量时,其初始化已完成。
-
-
并发工具类
如CountDownLatch、CyclicBarrier等,用于更复杂的线程同步。
四、常见问题与面试考点
-
volatile能否保证原子性?
-
不能。
volatile仅保证读写操作的原子性,但复合操作(如i++)仍需同步。
-
-
DCL(双检锁)单例模式为什么要加volatile?
-
防止指令重排序导致其他线程获取未初始化完成的对象。
-
-
synchronized和ReentrantLock的区别?
-
synchronized是JVM内置锁,自动释放;ReentrantLock需手动加锁/解锁,支持公平锁、条件变量。
-
-
什么是内存可见性问题?如何解决?
-
线程A修改变量后未及时同步到主内存,线程B读取旧值。
-
解决:
volatile、synchronized、Lock。
-
-
指令重排序的典型场景?
-
单例模式初始化:
new Object()可能被拆分为分配内存、初始化对象、赋值引用三步,重排序后导致空指针。
-
-
什么是“线程安全的发布”?
-
对象在构造完成后才能被其他线程访问。
-
方式:
volatile、静态初始化块、final域、线程安全容器(如ConcurrentHashMap)。
-
jJ五、代码示例:内存可见性问题
public class VisibilityDemo {// 不加volatile可能导致死循环private static volatile boolean flag = true;
public static void main(String[] args) throws InterruptedException {new Thread(() -> {while (flag) {} // 线程可能读取到旧的flag值System.out.println("Thread stopped.");}).start();
Thread.sleep(1000);flag = false; // 主线程修改flag}
}
六、面试总结
-
必考知识点
-
volatile的作用与原理
-
synchronized的底层实现(Monitor、锁升级)
-
Happens-Before原则的规则
-
指令重排序与内存屏障
-
-
加分回答
-
结合JMM分析ConcurrentHashMap的线程安全设计。
-
对比JMM与物理内存模型(CPU缓存、MESI协议)。
-
掌握JMM是写出高并发代码的基础,也是大厂面试的必考领域!
相关文章:
学习笔记04——JMM内存模型
一、Java内存模型(JMM)是什么? Java内存模型(Java Memory Model, JMM)是Java多线程编程中共享内存的访问规则,定义了线程如何与主内存(Main Memory)和工作内存(Work Mem…...
前端面试真题 2025最新版
文章目录 写在前文CSS怪异盒模型JS闭包闭包的形成闭包注意点 CSS选择器及优先级优先级 说说flex布局及相关属性Flex 容器相关属性:Flex 项目相关属性 响应式布局如何实现是否用过tailwindcss,有哪些好处好处缺点 说说对象的 prototype属性及原型说说 pro…...
Android 老项目 jcenter 库失效
最近重新维护了一些老项目发现大部分jcenter库失效了, Could not resolve com.xx:2.1.3. 如果你也遇到了,不妨试试 替换为 aliyun的jcenter服务,就不用一个个找代替库了。 project 下的 build.gradle 文件添加: maven { url htt…...
《论多源数据集成及应用》审题技巧 - 系统架构设计师
论多源数据集成及应用写作框架 一、考点概述 本论题“论多源数据集成及应用”主要考察的是计算机软件测试工程师在数据管理和集成方面的专业知识与实践能力。论题聚焦于信息爆炸时代企业、组织和个人所面临的数据挑战,特别是如何有效地收集、整理和清洗来自不同渠…...
2025.2.23机器学习笔记:PINN文献阅读
2025.2.23周报 一、文献阅读题目信息摘要Abstract创新点网络架构架构A架构B架构C 实验结论后续展望 一、文献阅读 题目信息 题目: Physics-Informed Neural Networks for Modeling Water Flows in a River Channel期刊: IEEE TRANSACTIONS ON ARTIFICI…...
Python Django系列—入门实例(二)
数据库配置 现在,打开 mysite/settings.py 。这是个包含了 Django 项目设置的 Python 模块。 默认情况下, DATABASES 配置使用 SQLite。如果你是数据库新手,或者只是想尝试 Django,这是最简单的选择。SQLite 包含在 Python 中…...
【DeepSeek系列】05 DeepSeek核心算法改进点总结
文章目录 一、DeepSeek概要二、4个重要改进点2.1 多头潜在注意力2.2 混合专家模型MoE2.3 多Token预测3.4 GRPO强化学习策略 三、2个重要思考3.1 大规模强化学习3.2 蒸馏方法:小模型也可以很强大 一、DeepSeek概要 2024年~2025年初,DeepSeek …...
独立开发者之Google Analytics使用教程
Google Analytics(GA)是Google提供的一款免费的网络分析服务,用于追踪和报告网站流量。以下是独立开发者如何使用Google Analytics的详细教程: 1. 创建Google Analytics账户 注册Google账户:如果你还没有Google账户&…...
C++ 编程语言简介
C 是一种通用编程语言,它是作为 C 语言的增强而开发的,以包含面向对象的范例。它是一种命令式和编译语言。 C 是一种高级的通用编程语言,专为系统和应用程序编程而设计。它由贝尔实验室的 Bjarne Stroustrup 于 1983 年开发,作为…...
计算机毕业设计SpringBoot+Vue.js明星周边产品销售网站(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
JavaScript系列(86)--现代构建工具详解
JavaScript 现代构建工具详解 🔨 现代前端开发离不开构建工具,它们帮助我们处理模块打包、代码转换、资源优化等任务。让我们深入了解主流的构建工具及其应用。 构建工具概述 🌟 💡 小知识:构建工具主要解决代码转换…...
C/C++高性能Web开发框架全解析:2025技术选型指南
一、工业级框架深度解析(附性能实测) 1. Drogon v2.1:异步框架性能王者 核心架构: Reactor 非阻塞I/O线程池(参考Nginx模型) 协程实现:基于Boost.Coroutine2(兼容C11)…...
使用Windbg调试目标进程排查C++软件异常的一般步骤与要点分享
目录 1、概述 2、将Windbg附加到已经启动起来的目标进程上,或者用Windbg启动目标程序 2.1、将Windbg附加到已经启动起来的目标进程上 2.2、用Windbg启动目标程序 2.3、Windbg关联到目标进程上会中断下来,输入g命令将该中断跳过去 3、分析实例说明 …...
npm使用了代理,但是代理软件已经关闭导致创建失败
如果在关闭前打开了vscode,此时vscode中的终端没有刷新,就会出现这个问题,最开始会一直转圈圈,直到超时,然后出现该报错 ❯ npm create vuelatest npm error code ECONNREFUSED npm error syscall connect npm error …...
ddd 文章总结分享,ddd实战代码分享, 领域驱动设计java实战源码大全,我看过的ddd java源码
1. 前段时间研究ddd, 收藏了很多相关知识,分享出来,希望能够帮助更多的小伙伴了解ddd, 什么是领域驱动设计,并分享在github发现的开源ddd代码 2. ddd 必须强烈点赞阿里两位大佬,一个为殷浩, 一个为cola作者 2.1.1 殷浩…...
什么是MySql的主从复制(主从同步)?
主页还有其他面试题总结,有需要的可以去看一下,喜欢的就留个三连再走吧~ 1.什么是MySql的主从复制原理? 主从复制的核心就是二进制binlog(DDL(数据定义语言)语句和DML(数据操纵语言)…...
蓝桥云课python代码
第一章语言基础 第一节编程基础 1 python开发环境 第一个Python程序 # 打印"Hello World" print("Hello World")# 打印2的100次方 print(2 ** 100)# 打印112 print("11",1 1)""" Hello World 126765060022822940149670320537…...
网站快速收录:如何优化网站H标签使用?
为了优化网站H标签的使用并促进网站快速收录,可以从以下几个方面进行考虑和操作: 一、理解H标签的重要性及作用 H标签,也称为Heading标签,是HTML中用于强调文本标题的元素,分为H1到H6六个级别,其重要性依…...
c#丰田PLC ToyoPuc TCP协议快速读写 to c# Toyota PLC ToyoPuc读写
源代码下载 <------下载地址 历史背景与发展 TOYOPUC协议源于丰田工机(TOYODA)的自动化技术积累。丰田工机成立于1941年,最初是丰田汽车的机床部门,后独立为专注于工业机械与控制系统的公司。2006年与光洋精工(Ko…...
深入解析-无状态服务-StatefulSet (一)
一、有状态服务 VS 无状态服务 1.无状态服务介绍 1.数据方面:无状态服务不会在本地存储持久化数据.多个实例可以共享相同的持久化数据 2.结果方面:多个服务实例对于同一个用户请求的响应结果是完全一致的 3.关系方面:这种多服务实例之间是…...
3.18 ReAct 理论实战:构建动态推理-行动循环的企业级 Agent
ReAct 理论实战:构建动态推理-行动循环的企业级 Agent 关键词:ReAct 理论实践, 动态工具调用, 反思迭代机制, 企业级 Agent 架构, LangChain 集成 1. ReAct 理论核心要素解析 1.1 传统 Agent vs ReAct Agent 架构对比 #mermaid-svg-t2TFPvWG94jJjpRG {font-family:"tr…...
【JavaScript】JavaScript 常见概念 - 变量与数据类型 - 运算符 - 条件语句 - 循环 - 函数 - 数组操作 - 对象
1. 变量与数据类型 变量声明 JavaScript 提供了三种方式来声明变量: var(全局或函数作用域,不推荐)let(块级作用域,推荐)const(常量,块级作用域,推荐&…...
常用视频格式及其编码方式对比
视频格式和编码方式是两个不同的概念,视频格式通常指的是视频文件的容器格式,它定义了如何将视频、音频和其他数据(如字幕)打包在一起,而编码方式是指视频和音频数据的压缩算法。不同的编码方式决定了视频的质量、文件…...
hackmyvm-buster
题目地址 信息收集 主机发现 ┌──(root㉿kali)-[/home/kali] └─# arp-scan -I eth1 192.168.56.0/24 Interface: eth1, type: EN10MB, MAC: 00:0c:29:34:da:f5, IPv4: 192.168.56.103 WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied WARNING: C…...
模型蒸馏:让人工智能更智能、更小、更高效的艺术
你有没有想过,我们如何才能让一个需要巨大计算能力的庞大人工智能模型变得更精简、更快速、更强大?答案在于模型蒸馏,这是一种允许知识从大型、计算成本高昂的人工智能系统转移到较小、更高效的系统的技术,而不会牺牲智能。 什么是模型蒸馏 模型蒸馏是一种技术,其…...
【原创】Windows11安装WSL“无法解析服务器的名称或地址”问题解决方法
原因分析 出现这个问题一开始以为WSL设置了某个服务器,但是通过运行 nslookup www.microsoft.com 出现下面的提示 PS C:\Windows\system32> nslookup www.microsoft.com 服务器: UnKnown Address: 2408:8000:XXXX:2b00:8:8:8:8非权威应答: 名称: e13678…...
基于模仿学习(IL)的端到端自动驾驶发展路径
基于模仿学习(IL)的端到端自动驾驶发展路径 1. 核心论文解析 (1) UniAD:感知-规划一体化 核心思想:首次提出将感知任务(如目标检测、车道线识别、轨迹预测)与规划任务集成到统一的端到端框架中ÿ…...
网页制作08-html,css,javascript初认识のhtml使用框架结构,请先建立站点!
框架一般由框架集和框架组成。 框架集就像一个大的容器,包括所有的框架,是框架的集合。 框架是框架集中一个独立的区域用于显示一个独立的网页文档。 框架集是文件html,它定义一组框架的布局和属性,包括框架的数目,框架…...
【Vscode 使用】集合1
一、使用make工具管理工程 windows下,下载mingw64,配置好mingw64\bin 为 Win10系统全局变量后。 在mingw64/bin目录下找到mingw32-make.exe工具。复制一份改名为:make.exe,没错,就是那么简单,mingw64自带m…...
文章精读篇——用于遥感小样本语义分割的可学习Prompt
题目:Learnable Prompt for Few-Shot Semantic Segmentation in Remote Sensing Domain 会议:CVPR 2024 Workshop 论文:10.48550/arXiv.2404.10307 相关竞赛:https://codalab.lisn.upsaclay.fr/competitions/17568 年份&#…...
