一文读懂Java多线程并发之内存模型

 什么是内存模型?

Java内存模型(Java Memory Model)描述了Java编程语言中的线程如何与内存进行交互,是和多线程相关的一组规范,需要各个 JVM 的实现来遵守 JMM 规范,以便于开发者可以利用这些规范,更方便地开发多线程程序。有了这些规范,即便同一个程序在不同操作系统的虚拟机上运行,得到的程序结果也是一致的。如果没有这些规范,不同操作系统的虚拟机对相同关键字的解释不一致,这是不可接受的。JMM旨在解决 CPU 多级缓存、处理器优化、指令重排等导致的结果不可预期的问题。

特别注意一点,Java内存模型是与多线程并发相关的规范,不是JVM内存结构。JVM内存结构讲的是JVM如何划分运行时内存区域,比如虚拟机规范将内存区域划分为堆区、方法区、虚拟机栈、本地方法栈、程序计数器五个区域。不同虚拟机可能在实现上会略有不同,但总体是按规范实现的。比如Hotspot虚拟机栈和本地方法栈是合并实现的,JDK8方法区用元空间来实现,但JDK7以下则可能是永久代来实现。

内存模型是同步关键字原理

在Java程序中,volatile、synchronized、Lock等同步关键字或锁工具类其实现原理都涉及JMM规范,或说它们就是遵循JMM规范来实现的。

比如说,我们使用volatile来修饰一个共享变量,那么这个变量在多线程环境下,数据变更会立刻从工作内存刷新回主内存以确保变量的可见性。同时,被volatile来修饰的变量也会禁止指令重排序。synchronized也有同样的效果,保证可见性,禁止指令重排序,同时会变量添加monitor对象锁,多个线程访问被synchronized修饰的变量只能等其它线程释放锁才能访问此变量。因此,synchronized能保证变量的线程安全,相当于将变量的读写串行化了,因此能保证变量的线程安全。

JMM最重要的三个东西上面基本都已提及,即原子性、可见性与指令重排序。下面我们详细了解下这几方面的内容。

什么是原子性?

在介绍Java线程的文章中也有提及,这里再次拿出来讲述一下。具备原子性的操作被称为原子操作,原子操作可以认为是一个或一组不可分割的操作,操作要么做完了,要么就都不做,不存在只做一半的情况,原子性意味着不可分割。编程界经典操作,i++,这句代码看似只有一句代码,好像很原子了,实际则不然。下面例子你觉得会打印1还是0?

public class AddTest3 {private static int i

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/31813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WHAT - HTTP keep-alive 持久性连接和内存泄漏问题

目录 一、介绍HTTP 持久性连接(persistent connection)实现细节示例持久性连接的优化管道化(Pipelining)HTTP/2 和 HTTP/3 二、Node.js HTTP Agent 开启 keepAlive 导致的内存泄漏问题Node.js HTTP Agent 和 Socket 池Keep-Alive …

聚焦 Navicat 17 新特性 | 查询与配置的革新之处

随着 Navicat 17 的发布,引起业界热烈讨论与关注,这也标志着 Navicat 的产品力再次飞跃。新版本引入的众多创新特性极大地提升了用户在数据库管理和数据分析方面的体验,涵盖模型设计与同步、数据字典、数据分析(data profiling&am…

图说SpringCloudStream消息驱动

SpringCloud Stream消息驱动实现原理 通过定义Binder绑定器作为中间层,实现了应用程序和消息中间件之间实现细节的隔离。通过向应用程序暴露统一的Channel通道,可以让应用程序不再需要考虑各种不同的消息中间件实现的兼容性问题。当需要升级消息中间件&a…

第九届世界渲染大赛什么时候开始举办?

​第九届世界渲染大赛即将开启,全球设计师和艺术家将汇聚一堂,展现3D艺术的创新与美感。敬请期待这场业界顶级的视觉盛宴,让我们共同关注大赛的启幕时刻。 第九届世界渲染大赛开始时间 预计时间:2024年7月(中旬) 报名方法&#…

服务端代码编写中MySql大小写在Java中报错问题解决

报错信息: 原因:MySql和Java变量大小写产生的冲突。 经过查阅各个博客等,得出浅显结论(不一定对):MySql大小写不敏感,Java大小写敏感,当Javabean转为MySql数据库表时,Ja…

微信小程序生命周期

微信小程序的生命周期包括两个主要部分:应用生命周期和页面生命周期。下面我将详细介绍它们的具体内容。 应用生命周期 onLaunch: 触发时机:小程序初始化完成时(全局只触发一次)。 用途:通常用于进行一些…

高效处理大数据:Kafka的13个核心概念详解

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 大家好,我是你们的小米!今天我们来深入探讨一下Kafka这个强大而复杂的数据流平台。Kafka被广泛应用于高吞吐量、低延迟的数据流应用场景中。那么,我…

名校介绍|英国六所红砖大学

​近年来由于美国的拒签率增加,很多公派申请者,尤其是CSC资助的访问学者、公派联合培养学生及博士后研究学者,把出国目标改为其它发达国家,尤以英国居多,本文知识人网小编就重点介绍六所英国红砖大学。 我们在“英国大…

Standalone原理讲解与实操演示

这课的一个学习的话,我们基本上了解了flink对不同的一个集群资源管理器上的一个支持,以及我们的一个net ude部署模式上面的一个特点的一些个了解。通过本课的学习,我们将去逐步去了解一下flink on standard allow的这种集群部署模式上面的一个…

基于JSP技术的固定资产管理系统

开头语:你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言:Java 数据库:MySQL 技术:JSPServlet 工具:MyEclipse、Tomcat 系统展示 首页 注册界面…

RocketMQ的安装和原理

.RocketMQ的安装 一.RocketMQ安装 1.1.下载RocketMQ 下载地址:http://rocketmq.apache.org/release_notes/release-notes-4.2.0/ 下载后解压 Bin : 可执行文件目录 config:配置文件目录 Lib : 依赖库,一堆Jar包 1.2.配置ROCKETMQ_HOME…

uniapp中Error: project.configjson: libVersion 字段需为 string. string

错误如下 找到manifestjson文件到源码视图 添加这段代码"libVersion": "latest",即可

众爱宠物开源项目介绍

众爱宠物管理系统是一个集会员管理、宠物管理、商品管理、库存管理、数据管理、收银管理、多门店管理等功能于一体的综合管理系统,具有操作方便、简单、安全等优点。 开源项目地址

Nacos2.2.3默认无需登录,配置中开启验证不生效

Nacos由于反序列化漏洞,需要升级到2.2.3。 升级后发现不需要登录就可以进行操作,出于安全考虑,需要开启验证。 按照网上的方法进行配置后,重启Nacos仍然不需要登录。 最后发现是我们使用的集成框架默认在代码中关闭了开关&#xf…

基于STM32和人工智能的智能仓储管理系统

目录 引言环境准备智能仓储管理系统基础代码实现:实现智能仓储管理系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景:智能仓储管理与优化问题解决方案与优化收尾与总结 1. 引言 智能仓储管理系统通过结合STM32嵌…

Hadoop 2.0 大家族(二)

目录 三、Hbase(一)Hbase简介(二)Hbase入门 四、Pig(一)Pig简介(二)Pig入门 三、Hbase Hbase是基于Hadoop的开源分布式数据库,它以Google的BigTable为原型,设…

小程序项目业务逻辑回忆3

1.用户激活票劵 在我的票劵未激活票劵查询业务中,票劵是可以通过激活按钮进行激活的 该业务涉及3个表users用户信息表\order_items门票订单关联表\signin_records签到信息表 用户激活票劵时,首先使用该用户user_id创建signin_record表,signin_record表中门票类型ticket_type…

天地图(二)引入地图

1、在public下的index.html中引入天地图 <script src"http://api.tianditu.gov.cn/api?v4.0&tk你的密钥"></script> 2、在vue文件中写入 <template><div:id"mapDiv currentIndex"class"map"style"position: a…

生成式AI和LLM的一些基本概念和名词解释

1. Machine Learning 机器学习是人工智能&#xff08;AI&#xff09;的一个分支&#xff0c;旨在通过算法和统计模型&#xff0c;使计算机系统能够从数据中学习并自动改进。机器学习算法使用数据来构建模型&#xff0c;该模型可用于预测或决策。机器学习应用于各种领域&#x…

C语言基础关键字的含义和使用方法

​关键字在C语言中扮演着非常重要的角色&#xff0c;它们定义了语言的基本构造和语法规则&#xff0c;通过使用关键字&#xff0c;开发者可以创建变量、定义数据类型、控制程序流程&#xff08;如循环和条件判断&#xff09;、声明函数等。由于这些字是保留的&#xff0c;所以编…