学习笔记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…...
将VsCode变得顺手好用(1
目录 设置中文 配置调试功能 提效和增强相关插件 主题和图标相关插件 创建js文件 设置中文 打开【拓展】 输入【Chinese】 下载完成后重启Vs即可变为中文 配置调试功能 在随便一个位置新建一个文件夹,用于放置调试文件以及你未来写的代码,随便命名但…...
Fisher信息矩阵(Fisher Information Matrix,简称FIM)
Fisher信息矩阵简介 Fisher信息矩阵(Fisher Information Matrix,简称FIM)是统计学和信息理论中的一个重要概念,广泛应用于参数估计、统计推断和机器学习领域。它以统计学家罗纳德费希尔(Ronald Fisher)的名…...
Vue2+Three.js加载并展示一个三维模型(提供Gitee源码)
目录 一、案例截图 二、安装Three.js 三、代码实现 四、Gitee源码 一、案例截图 二、安装Three.js npm install three 三、代码实现 模型资源我是放在public文件夹下面的: 完整代码: <template><div><div ref"container&qu…...
Linux红帽:RHCSA认证知识讲解(三)Linux基础指令与Vim编辑器的使用
Linux红帽:RHCSA认证知识讲解(三)Linux基础指令与Vim编辑器的使用 前言一、Linux基础指令二、Linux 文件系统层次结构概念三、通过路径指定文件四、使用命令行工具管理文件五、Vim 的安装方式六、Vim 的操作模式七、红帽建议掌握的 Vim 键和命…...
python读取sqlite温度数据,并画出折线图
需求: 在Windows下请用python画出折线图,x轴是时间,y轴是温度temperature 和体感温度feels_like_temperature 。可以选择县市近1小时,近1天,近1个月的。sqlite文件weather_data.db当前目录下,建表结构如下…...
《论企业集成平台的理解与应用》审题技巧 - 系统架构设计师
企业集成平台的理解与应用——论文写作框架 一、考点概述 本论题“企业集成平台的理解与应用”主要考察的是计算机软件测试工程师对于企业集成平台(EIP)的深入理解以及在实际项目中的应用能力。论题涵盖了以下几个核心内容: 首先ÿ…...
UE Python笔记
插件 官方 商城 Python Editorhttps://www.fab.com/listings/f4c99ba0-1a86-4f6a-b19d-2fd13f15961b GitHUB 好像只更新到了2020年4.2x的版本。可能有大佬改了5.x的版本。也希望分享给我一份。谢谢 https://github.com/20tab/UnrealEnginePython 学习笔记 网上教程一大堆。…...
使用django调用deepseek api,搭建ai网站
一、deepseek简介 DeepSeek是一家人工智能公司,专注于开发先进的人工智能模型和技术。以下是关于DeepSeek的一些详细介绍: 1.公司背景 DeepSeek由杭州深度求索人工智能基础技术研究有限公司开发,致力于通过创新的技术和算法,推…...
YOLOv12 ——基于卷积神经网络的快速推理速度与注意力机制带来的增强性能结合
概述 实时目标检测对于许多实际应用来说已经变得至关重要,而Ultralytics公司开发的YOLO(You Only Look Once,只看一次)系列一直是最先进的模型系列,在速度和准确性之间提供了稳健的平衡。注意力机制的低效阻碍了它们在…...
两台互通的服务器使用Docker部署一主两从MySQL8.0.35
文章目录 1. 使用Docker Overlay网络(需Swarm模式)在服务器1(172.25.0.19)上:在服务器2(172.25.0.20)上:创建 overlay 网络(172.25.0.19): 2. 部署…...
Java23种设计模式案例
目录 一、概述 二、创建型模式 (Creational Patterns) 单例模式 (Singleton Pattern) 工厂方法模式 (Factory Method Pattern) 抽象工厂模式 (Abstract Factory Pattern) 建造者模式 (Builder Pattern) 原型模式 (Prototype Pattern) 三、结构型模式 (Structu…...
stm32hal库寻迹+蓝牙智能车(STM32F103C8T6)
简介: 这个小车的芯片是STM32F103C8T6,其他的芯片也可以照猫画虎,基本配置差不多,要注意的就是,管脚复用,管脚的特殊功能,(这点不用担心,hal库每个管脚的功能都会给你罗列,很方便的.)由于我做的比较简单,只是用到了几个简单外设.主要是由带霍尔编码器电机的车模,电机…...
JavaScript知识点4
1.解释一下这段JavaScript代码 var fruits ["Apple", "Orange", "Apple", "Mango"]; var a fruits.indexOf("Apple",-1); console.log("index"a); 输出的a值为-1,indexOf的第二个参数是-1…...
形式化数学编程在AI医疗中的探索路径分析
一、引言 1.1 研究背景与意义 在数字化时代,形式化数学编程和 AI 形式化医疗作为前沿领域,正逐渐改变着我们的生活和医疗模式。形式化数学编程是一种运用数学逻辑和严格的形式化语言来描述和验证程序的技术,它通过数学的精确性和逻辑性,确保程序的正确性和可靠性。在软件…...
QT 引入Quazip和Zlib源码工程到项目中,无需编译成库,跨平台,加密压缩,带有压缩进度
前言 最近在做项目时遇到一个需求,需要将升级的文件压缩成zip,再进行传输; 通过网络调研,有许多方式可以实现,例如QT私有模块的ZipReader、QZipWriter;或者第三方库zlib或者libzip或者quazip等࿱…...
Ubuntu 安装 Nginx并配置反向代理
Ubuntu版本:Ubuntu 24.04.2 LTS 一、安装Nginx 更新系统软件包 安装前需确保系统处于最新状态,避免依赖冲突 sudo apt update && sudo apt upgrade -y 安装Nginx主程序 Ubuntu官方仓库已包含稳定版Nginx,直接安装即可 sudo…...
GitHub SSH连接问题解决指南
🔍 GitHub SSH连接问题解决指南 问题描述 遇到错误:ssh: connect to host github.com port 22: Connection refused 说明您的网络环境无法访问GitHub的SSH端口22,常见原因: 防火墙/网络运营商限制(国内常见…...
C++ 跨平台的 GetCurrentThreadId() 获取当前线程ID实现
支持:C11 及早前标准库版本,而无需使用:std::this_thread::get_id()。 支持:NDK/ANDROID、Windows、Linux、MacOS X 等多个操作系统平台。 int64_t GetCurrentThreadId() noexcept { #if defined(_WIN32) || defined(_WIN64)retu…...
钉钉MAKE AI生态大会思考
1. 核心特性 1.1 底层模型开放 除原有模型通义千问外,新接入猎户星空、智普、MinMax、月之暗面、百川智能、零一万物。 1.2 AI搜索 AI搜索贯通企业和个人散落在各地的知识(聊天记录、文档、会议、日程、知识库、项目等),通过大模型对知识逻辑化,直接生成搜索的答案,并…...
从微调到部署:如何通过对话模板对齐确保vLLM与LLaMA-Factory的推理效果一致
1. 为什么你的微调模型在vLLM上效果变差了? 最近帮几个团队排查大模型部署问题,发现一个高频痛点:在LLaMA-Factory微调好的模型,用vLLM部署后生成质量明显下降。比如有个做客服机器人的团队,微调时回答准确率能达到92%…...
cv_resnet101_face-detection_cvpr22papermogface环境部署教程:ModelScope Pipeline集成详解
cv_resnet101_face-detection_cvpr22papermogface环境部署教程:ModelScope Pipeline集成详解 1. 引言 你有没有遇到过这样的场景?手头有一堆照片,需要快速找出里面有多少人,每个人脸在什么位置。传统方法要么不准,要…...
终极指南:Armeria与Spring Boot无缝整合的企业级应用开发最佳实践
终极指南:Armeria与Spring Boot无缝整合的企业级应用开发最佳实践 【免费下载链接】armeria Your go-to microservice framework for any situation, from the creator of Netty et al. You can build any type of microservice leveraging your favorite technolog…...
5分钟搞定Fun-ASR语音识别:支持方言歌词识别,新手友好
5分钟搞定Fun-ASR语音识别:支持方言歌词识别,新手友好 1. 快速了解Fun-ASR语音识别 Fun-ASR-MLT-Nano-2512是阿里通义实验室推出的轻量级语音识别模型,特别适合需要快速上手的开发者。这个模型最吸引人的地方在于它能识别31种语言ÿ…...
Windows 10/11下快速搞定Netcat安装:从下载到测试的完整指南
Windows 10/11下快速搞定Netcat安装:从下载到测试的完整指南 在Windows环境下进行网络应用开发时,经常需要测试TCP/UDP连接或模拟简单的客户端/服务器交互。虽然Linux系统自带netcat工具,但频繁切换操作系统环境会打断开发节奏。本文将手把手…...
从浏览器到讲台:PPTist如何用Vue3重新定义在线演示文稿编辑体验
从浏览器到讲台:PPTist如何用Vue3重新定义在线演示文稿编辑体验 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS PowerPoint, al…...
Redis命令处理机制源码探究粗
一、项目背景与核心价值 1. 解决的核心痛点 Navicat的数据库连接密码并非明文存储,而是通过AES算法加密后写入.ncx格式的XML配置文件中。一旦用户忘记密码,常规方式只能重新配置连接,效率极低。本项目只作为学习研究使用,不做其他…...
Marketch终极指南:如何快速将Sketch设计稿转换为HTML页面
Marketch终极指南:如何快速将Sketch设计稿转换为HTML页面 【免费下载链接】marketch Marketch is a Sketch 3 plug-in for automatically generating html page that can measure and get CSS styles on it. 项目地址: https://gitcode.com/gh_mirrors/ma/marketc…...
Zenodo科研数据下载终极指南:如何用zenodo_get快速获取研究资料
Zenodo科研数据下载终极指南:如何用zenodo_get快速获取研究资料 【免费下载链接】zenodo_get Zenodo_get: Downloader for Zenodo records 项目地址: https://gitcode.com/gh_mirrors/ze/zenodo_get 在当今科研工作中,高效获取研究数据是每个研究…...
Qwen3-Embedding-4B入门指南:向量归一化对余弦相似度计算的影响实验对比
Qwen3-Embedding-4B入门指南:向量归一化对余弦相似度计算的影响实验对比 1. 引言:从关键词匹配到语义理解 你有没有遇到过这样的烦恼?在文档里搜索“苹果”,结果既找到了水果,也找到了手机,甚至还有一堆无…...
