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

JMM——Java内存模型简介

JMM介绍JMM是基于CPU缓存模型实现的一套Java内存管理程序都在于解决多核情况下的缓存同步问题。它定义了主存和工作内存的抽象概念底层对应着CPU寄存器、高速缓存、RAM、CPU指令优化等。CPU缓存模型JMM特性可见性volatile可以保证不同线程对共享变量进行操作时的可见性。即当一个线程修改了共享变量时另一个线程可以读取到共享变量被修改后的值。有序性volatile会通过禁止指令重排序进而保证有序性。原子性对于单个的volatile修饰的变量的读写是可以保证原子性的但对于i这种复合操作并不能保证原子性。这句话的意思基本上就是说volatile不具备原子性了。【注】i属于非原子性操作是int tmp i;i tmp1;的简化这个流程分为了读-改-写一共三个原子性操作JMM特性的应用方式同时实现可见性、有序性、原子性需要使用synchronized,但是耗费性能同时实现可见性、有序性需要给共享变量加上volatile修饰符也就是适用于仅有一个线程修改其它线程读取的场景因为无原子性必须保证并发安全。【注】synchronized无法实现有序性所以需要volatile修饰符的加入同样的volatile修饰的变量如果想要具备原子性也需要锁机制的帮助例如synchronized或者Unsafecas指令例如AtomicInteger的实现单线程无需关心JMM特性原因是不会有其它线程操作数据不需要可见性和原子性无序性只是用于提升性能不会无脑影响语义多线程必须关心JMM特性原因是其它线程操作数据不可能用旧数据并且要保证数据的并发安全这需要可见性和原子性虽然指令重排提升了性能但会导致其它线程检测时机不准导致一些异常情况这需要禁止指令重排可见性volatile可见性实现原理【注】上图主存指的是所有线程共享的数据比如公共静态成员变量、公共成员变量而工作内存是线程自己私有的数据。如图所示别看加了一个volatile但是底层实现很繁杂首先要确保开启缓存一致性协议每个线程都要开启总线嗅探机制 会给主存的变量加锁然后基于以上步骤实现可见性如果存在资源的竞争这时需要加上锁来资源分配以保证线程资源安全有序性定义编码执行顺序可能会被编译器或者CPU进行指令重排序这原是一种高效执行策略但可以导致一些运行出现异常因此要禁止指令重排序。案例1DCLdouble check lockinginstance变量通过volatile的修饰获取了可见性和有序性代码如下。public class Singleton { private static volatile Singleton instance; public static Singleton getInstance() { if (instance null) { // 第一次检查 synchronized (Singleton.class) { if (instance null) { // 第二次检查 instance new Singleton(); // 创建对象 } } } return instance; } }没有volatile修饰instance new Singleton()执行指令分配内存在堆里给对象找块空地。赋值引用把内存地址赋给instance。初始化对象调用构造方法填充字段值。拥有volatile修饰instance new Singleton()执行指令分配内存在堆里给对象找块空地。初始化对象调用构造方法填充字段值。赋值引用把内存地址赋给instance。store作废其它线程的instance缓存并将instance回更到主存。案例2读写标志位通过添加volatile修饰符保证了可见性和有序性// 全局变量 int config 0; // 配置数据 boolean volatile ready false; // 初始化完成标志 // 线程 A (初始化线程) void init() { config 123; // 1. 写入配置数据 ready true; // 2. 标记初始化完成 } // 线程 B (使用线程) void use() { if (ready) { // 3. 检查标志 doSomething(config); // 4. 使用配置 } }可见性保证了写线程变更标志位后读线程可以立刻检测有序性保证了写线程按序执行不会导致必要的数据还未执行【注】如果案例1和案例2不是多线程而是单线程则无需担心可见性和有序性的问题原子性定义要么执行成功要么退回原样不会被其它线程所干扰不会发生上下文切换 或者 发生上下文切换但被同步锁保护分类1.指令层面的原子性天然具备单个指令往往具有原子性特征例如赋值、cas操作或者读取操作这类指令在执行当中不会发生上下文切换2.代码层面的原子性由多个指令组成的复杂指令例如i、new Object() 或者 一堆代码逻辑这类复杂指令在执行当中虽然会上下文切换但是可以用锁实现并发安全。【注】CPU指令集支持CAS操作而且是原子性CAS操作的硬件层面流程为锁住地址拒绝其它核心操作——数据校验——数据变更稍提一嘴硬件层面的阻塞是一种运行态下的等待这不同于内核态或者用户态的阻塞逻辑volatilevolatile并不保证原子性它仅用于实现共享数据的可见性和有序性

相关文章:

JMM——Java内存模型简介

JMM介绍JMM是基于CPU缓存模型实现的一套Java内存管理程序,都在于解决多核情况下的缓存同步问题。它定义了主存和工作内存的抽象概念,底层对应着CPU寄存器、高速缓存、RAM、CPU指令优化等。CPU缓存模型JMM特性可见性:volatile可以保证不同线程…...

多模态跟踪怎么搞?清华西电TPAMI 2025新方法深度解析,从小白到大神,吃透这一篇就够了!

创新点 针对轻量化多模态跟踪器性能骤降的问题,设计了覆盖四大核心阶段的教师 - 学生知识蒸馏框架,首次将跨模态知识蒸馏与 Transformer 基多模态跟踪深度结合。突破传统随机掩码的局限性,基于教师模型的注意力权重划分模态公共、模态特定、…...

C#毕业设计——基于C#+asp.net+SVG的基于SVG的自动站雨量分析系统设计与实现(毕业论文+程序源码)——雨量分析系统

基于C#asp.netSVG的基于SVG的自动站雨量分析系统设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于C#asp.netSVG的基于SVG的自动站雨量分析系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报…...

C#毕业设计——基于C#+asp.net+SQL server的通用作业批改系统设计与实现(毕业论文+程序源码)——作业批改系统

基于C#asp.netSQL server的通用作业批改系统设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于C#asp.netSQL server的通用作业批改系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板…...

C#毕业设计——基于C#+asp.net+SQL Server的课程指导平台设计与实现(毕业论文+程序源码)——课程指导平台

基于C#asp.netSQL Server的课程指导平台设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于C#asp.netSQL Server的课程指导平台设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答…...

大模型有了“身体”后,我用1分钟创造了一个AI美食专家

一、引言 :从今晚吃什么开始 在这个互联网几乎能解决一切问题的时代,我们搜菜谱、看教程、点外卖,但厨房里的孤独感和手忙脚乱,似乎从未消失。 晚上7点,下班回家。打开冰箱:有西红柿、鸡蛋、青椒、一块肉…...

asp毕业设计——基于asp+access的网上音乐网站设计与实现(毕业论文+程序源码)——网上音乐网站

基于aspaccess的网上音乐网站设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于aspaccess的网上音乐网站设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴…...

asp毕业设计——基于asp+access的网上选题系统设计与实现(毕业论文+程序源码)——网上选题系统

基于aspaccess的网上选题系统设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于aspaccess的网上选题系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴…...

asp毕业设计——基于asp+access的网上投票系统设计与实现(毕业论文+程序源码)——网上投票系统

基于aspaccess的网上投票系统设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于aspaccess的网上投票系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴…...

asp毕业设计——基于asp+access的网上评教系统设计与实现(毕业论文+程序源码)——网上评教系统

基于aspaccess的网上评教系统设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于aspaccess的网上评教系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴…...

asp毕业设计—— 基于asp+access的网上论坛设计与实现(毕业论文+程序源码)——网上论坛

基于aspaccess的网上论坛设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于aspaccess的网上论坛设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴&#xf…...

004、体系结构之TiKV分布式事务

数据找到并且修改后。此时提交事务(commit)的时候。此时就进入两阶段:(prewrite - commit) 提交的第一阶段,会用三个CF 来存放这些数据信息。 一类列簇对应一类键值对, 第一个CF(default)存放的是数据 的键值对。 第二…...

网卡驱动死机调试经验案例

一、现象 执行iperf打流后,不管是udp打流还是tcp打流,命令行没有响应,无法敲入任何字符,也没有回显,但一段时间后,串口有打印,查看代码后,发现是EMAC的DMA中断里打印的,打…...

“水莲花数”

#include<stdio.h>main(){int a,b,c,d;for(a100;a<999;a){ba/100;ca/10%10;d%10if(b*b*bc*c*cd*d*da)printf(“对了 %d %d %d %d\n”,a,b,c,d);}}...

探索响应式编程的瑰宝:RxJava

探索响应式编程的瑰宝&#xff1a;RxJava 【免费下载链接】RxJava ReactiveX/RxJava 是一个用于实现响应式编程的 Java 库。适合在 Java 应用开发中使用&#xff0c;提高代码的简洁性和可维护性。特点是提供了强大的响应式编程功能、易于使用的 API 和多种数据源的支持。 项目…...

探索System Design Primer:系统设计学习的宝藏库

探索System Design Primer&#xff1a;系统设计学习的宝藏库 【免费下载链接】system-design-primer 学习如何设计大型系统。为系统设计面试做准备。包含Anki记忆卡片。 项目地址: https://gitcode.com/GitHub_Trending/sy/system-design-primer 项目简介 是一个开源项…...

Slackin终极指南:2025年功能路线图与社区发展预测

Slackin终极指南&#xff1a;2025年功能路线图与社区发展预测 【免费下载链接】slackin Public Slack organizations made easy 项目地址: https://gitcode.com/gh_mirrors/sl/slackin Slackin是一款让公共Slack组织创建和管理变得简单的工具&#xff0c;它提供了从用户…...

PyMuPDF: Python接口的高效PDF处理库

PyMuPDF: Python接口的高效PDF处理库 【免费下载链接】PyMuPDF PyMuPDF is a high performance Python library for data extraction, analysis, conversion & manipulation of PDF (and other) documents. 项目地址: https://gitcode.com/gh_mirrors/py/PyMuPDF 是…...

PyPDF2: Python PDF库简介

PyPDF2: Python PDF库简介 【免费下载链接】pypdf A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files 项目地址: https://gitcode.com/gh_mirrors/py/pypdf 是一个开源的Python库&#xff0c;用于处理PDF文…...

Symfony Translation 性能优化终极指南:使用 Blackfire 分析翻译瓶颈的 5 个关键步骤

Symfony Translation 性能优化终极指南&#xff1a;使用 Blackfire 分析翻译瓶颈的 5 个关键步骤 【免费下载链接】translation symfony/translation: 是一个用于 PHP 的翻译库&#xff0c;支持多种消息源和翻译格式&#xff0c;可以用于构建多语言的 Web 应用程序和 API。 项…...

终极Symfony Translation测试指南:从单元测试到集成测试的完整策略

终极Symfony Translation测试指南&#xff1a;从单元测试到集成测试的完整策略 【免费下载链接】translation symfony/translation: 是一个用于 PHP 的翻译库&#xff0c;支持多种消息源和翻译格式&#xff0c;可以用于构建多语言的 Web 应用程序和 API。 项目地址: https://…...

微调Llama3模型记录

为了评估llama3模型微调的效果&#xff0c;尝试使用一些特定风格的语料数据微调llama3模型&#xff0c;这里做一下简单记录。 一、模型及数据准备 原生的Meta-Llama-3-8B-Instruct模型对中文效果并不是很好&#xff0c;我这里直接去huggingface上下载的llama3的中文微调版作为…...

表情捕捉 表情同步 2026

目录 表情同步PersonaLive&#xff1a; 表情同步hyperreenact&#xff1a; speedupvideocap 基于MobileNetV3的人脸表情捕捉-加速 加速库 onnx/tensorRT 说明 表情同步PersonaLive&#xff1a; https://www.bilibili.com/video/BV1XkBhBBEP7 表情同步hyperreenact&#xf…...

如何贡献代码?GitHub Profilinator开发者贡献指南

如何贡献代码&#xff1f;GitHub Profilinator开发者贡献指南 【免费下载链接】github-profilinator &#x1f680; This tool contains mini GUI components that you can hook together to automatically generate markdown code for a perfect readme. 项目地址: https://…...

Awesome-LLMOps 项目使用教程

Awesome-LLMOps 项目使用教程 【免费下载链接】Awesome-LLMOps An awesome & curated list of best LLMOps tools for developers 项目地址: https://gitcode.com/gh_mirrors/aw/Awesome-LLMOps 1. 项目的目录结构及介绍 Awesome-LLMOps/ ├── README.md ├── …...

Cuckoo Filter核心原理:从哈希表到指纹存储的巧妙设计

Cuckoo Filter核心原理&#xff1a;从哈希表到指纹存储的巧妙设计 【免费下载链接】cuckoofilter Cuckoo Filter: Practically Better Than Bloom 项目地址: https://gitcode.com/gh_mirrors/cu/cuckoofilter Cuckoo Filter是一种高效的近似集合成员查询数据结构&#x…...

Mariana Trench高级应用:多规则联合检测与误报排除策略

Mariana Trench高级应用&#xff1a;多规则联合检测与误报排除策略 【免费下载链接】mariana-trench A security focused static analysis tool for Android and Java applications. 项目地址: https://gitcode.com/gh_mirrors/ma/mariana-trench Mariana Trench是一款专…...

IPED插件开发测试:编写单元测试与集成测试的完整指南

IPED插件开发测试&#xff1a;编写单元测试与集成测试的完整指南 【免费下载链接】IPED IPED Digital Forensic Tool. It is an open source software that can be used to process and analyze digital evidence, often seized at crime scenes by law enforcement or in a co…...

终极指南:YTKNetwork请求生命周期全解析——从发起请求到完成的完整流程

终极指南&#xff1a;YTKNetwork请求生命周期全解析——从发起请求到完成的完整流程 【免费下载链接】YTKNetwork 项目地址: https://gitcode.com/gh_mirrors/ytk/YTKNetwork YTKNetwork是一个功能强大的iOS网络请求库&#xff0c;它基于AFNetworking构建&#xff0c;提…...

CCV 开源项目使用教程

CCV 开源项目使用教程 【免费下载链接】ccv C-based/Cached/Core Computer Vision Library, A Modern Computer Vision Library 项目地址: https://gitcode.com/gh_mirrors/cc/ccv 1. 项目的目录结构及介绍 CCV&#xff08;C-based/Cached/Core Computer Vision Librar…...