了解Java内存模型(Java Memory Model, JMM)

了解Java内存模型(Java Memory Model, JMM)

Java内存模型(Java Memory Model, JMM)是Java语言规范中规定的一组规则,定义了多线程程序中变量(包括实例字段、静态字段和数组元素)的访问方式。JMM的设计目标是保证线程之间的内存可见性和操作的有序性,从而帮助开发者编写并发安全的程序。本文将详细介绍Java内存模型的各个方面。

1. 内存模型的基础

JMM定义了线程和主内存之间的抽象关系。在JMM中,每个线程都有一个私有的本地内存,包含了该线程使用到的变量的副本。线程之间的通信(例如一个线程写入一个变量,另一个线程读取这个变量)必须通过主内存来完成。一个线程对变量的修改必须在写入主内存后,其他线程才能看到这次修改。

2. 内存可见性

内存可见性是指一个线程对变量的修改,另一个线程能够看到的条件。JMM通过以下几个关键字来保证内存可见性:

2.1 volatile关键字

volatile关键字保证了变量在多个线程之间的可见性。当一个变量被声明为volatile时,JMM会保证所有线程都能看到这个变量的最新值。具体来说,JMM通过以下两个规则实现volatile的语义:

  • 当写入一个volatile变量时,JMM会强制将该变量的值刷新到主内存中。
  • 当读取一个volatile变量时,JMM会强制从主内存中读取该变量的最新值。

2.2 synchronized关键字

synchronized关键字用于实现线程之间的互斥访问。除了互斥功能外,synchronized还可以保证内存可见性:

  • 当一个线程进入synchronized块时,它必须先获得该块对象的锁,并清空本地内存中的变量副本。
  • 当一个线程退出synchronized块时,它必须将对变量的修改刷新到主内存中,并释放锁。

通过这种机制,synchronized保证了在synchronized块内对变量的修改对其他线程可见。

3. 有序性

有序性是指在多线程程序中,程序的执行顺序与代码的顺序一致。JMM通过以下几个方面来保证有序性:

3.1 happens-before规则

JMM通过happens-before原则来定义操作之间的有序性。happens-before是指如果一个操作happens-before另一个操作,那么第一个操作的结果对第二个操作可见,并且第一个操作在第二个操作之前执行。JMM定义了以下几种常见的happens-before关系:

  • 程序次序规则:在一个线程内,按照代码顺序,前面的操作happens-before后面的操作。
  • 锁定规则:一个unlock操作happens-before后面对同一个锁的lock操作。
  • volatile变量规则:对一个volatile变量的写操作happens-before后面对该变量的读操作。
  • 线程启动规则:Thread对象的start()方法happens-before该线程的每一个动作。
  • 线程终止规则:线程中的所有操作happens-before其他线程检测到该线程已经终止(通过Thread.join()或Thread.isAlive()方法)。

3.2 指令重排序

为了提高性能,编译器和处理器可能会对指令进行重排序,但这种重排序不会违反happens-before规则。JMM通过内存屏障(Memory Barriers)来禁止特定的重排序,从而保证程序的有序性和正确性。

4. 常见的内存一致性错误

在多线程编程中,未能正确处理内存可见性和有序性可能会导致一些常见的内存一致性错误,例如:

  • 读脏数据:一个线程读取了另一个线程未同步的写入数据。
  • 重排序导致的数据丢失:指令重排序导致程序的执行结果与预期不一致。

为了避免这些问题,开发者应当遵循JMM规定的规则,正确使用volatile和synchronized等关键字。

参考链接

  1. Java内存模型(JMM)详解:https://docs.oracle.com/javase/specs/jls/se11/html/jls-17.html
  2. Java并发编程实践(Java Concurrency in Practice):https://jcip.net/

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT-4o, 腾讯元宝,通义千问对比测试中文文化

国内的大模型应用我选择了国内综合实力最强的两个,一个是腾讯元宝,一个是通义千问。其它的豆包,Kimi,文心一言等在某些领域也有强于竞品的表现。 问一个中文文化比较基础的问题,我满以为中文文化chatGPT不如国内的大模型。可事实…

pdf文件在线压缩网站,pdf文件在线压缩工具软件

在数字化时代的今天,PDF文件已经成为我们日常生活和工作中不可或缺的一部分。然而,随着PDF文件的广泛使用,其文件大小问题也日益凸显。过大的PDF文件不仅占用了大量的存储空间,而且在传输和共享过程中也往往面临诸多不便。因此&am…

【日记】遇到了一个 “不愿睁眼看世界也没受过社会毒打” 的逆天群友(464 字)

正文 今天坐在柜台玩了一天手机…… 手机都玩没电了快。下午在劝一个群友睁眼看世界,实在劝不动。他真的太逆天了,我不清楚这么高学历的人,怎么能说出这么天真的话。逆天又离谱。 晚上的时间几乎全在做家务。平时晚上都是跳舞来着&#xff0c…

LeetCode LRU缓存

题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,…

关于 spring boot 的 目录详解 和 配置文件 以及 日志

目录 配置文件 spring boot 的配置文件有两种格式,分别是 properties 和 yml(yaml)。这两种格式的配置文件是可以同时存在的,此时会以 properties 的文件为主,但一般都是使用同一种格式的。 格式 properties 语法格…

Web UI自动化测试_Selenium+Python

一、概述: 1.1 Selenium是什么 Selenium 是一个基于浏览器的自动化工具,可以跨平台、跨浏览器使用。 Selenium 主要包括三部分: 1、Selenium IDE: Firefox 浏览器的一个插件(扩展),它可以进行…

搭建数字化营销平台带来的一系列积极影响!

在当今数字化时代,搭建数字化营销平台具有一系列令人瞩目的积极影响。 这种平台的搭建,能够有力地促进形成良好的产业生态。就如同搭建蚓链数字化生态营销系统这般,它强化了产业间的沟通与协作,使得各个环节紧密相连&#xff…

UI学习笔记(一)

UI学习 一:UIView基础frame属性隐藏视图对象:UIView的层级关系 二:UIWindow对象三:UIViewController基础UIViewController使用 四:定时器与视图移动五:UISwitch控件六:滑动条和进度条七&#xf…

python数据分析-ZET财务数据分析

一、公司背景 中兴通讯股份有限公司是一家总部位于中国深圳的跨国公司,致力于为全球客户提供通信设备和解决方案。公司成立于1985年,自成立以来一直致力于为客户提供创新的通信技术和服务。中兴通讯的业务涵盖多个领域,包括但不限于高端路由…

MySQL数据库操作基础(增删查改)

数据库操作基础(增删查改) 1.插入 1.1往数据表中插入一条数据 insert into 表名 values (值,值,值...)此处列出的这些值的数目和类型 要和表的相对应 1.2指定列插入 insert into 表名(列名) values (值);1.3一次插入多个记录 insert into 表名 values (值),(值)...一次插入…

weditor安装时提示This is an issue with the package mentioned above, not pip

报错如下: note: This error originates from a subprocess, and is likely not a problem with pip. error: metadata-generation-failed Encountered error while generating package metadata. ╰─> See above for output. note: This is an issue with …

matlab BP神经网络

clear clc % 准备数据 inputs rand(10, 100); % 100组输入,每组10个特征 outputs rand(1, 100); % 100组输出,每组1个输出值 % 将数据分成训练集和测试集 trainRatio 0.8; valRatio 0.1; testRatio 0.1; [trainInd, valInd, testInd] divid…

分布式一致性理论

分布式一致性理论 1.数据库事务ACID理论 为保证事务正确可靠而必须具备的四个核心特性。这四个特性分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(D…

【Python报错】已解决TypeError: can only concatenate str (not “int“) to str

解决Python报错:TypeError: can only concatenate str (not “int”) to str 在Python中,字符串连接是常见的操作,但如果你尝试将整数(int)与字符串(str)直接连接,会遇到TypeError: …

【机器学习基础】Python编程08:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

四十四、openlayers官网示例Geographic Coordinates解析——在地图上添加弹窗,点击显示图形信息

使用Overlay在地图上添加弹窗,点击控制显隐。 初始化图层的时候,添加一个矢量的点数据到地图上,在new Feature时添加一些自定义属性。 const place [-110, 45];const point new Point(place);const map new Map({target: "map"…

应用层——HTTP协议(自己实现一个http协议)——客户端(浏览器)的请求做反序列化和请求分析,然后创建http向响应结构

应用层:之前我们写的创建套接字,发送数据,序列化反序列化这些都是在写应用层 我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层 之前的网络计算机是我们自定义的协议:传输的数据最终是什么样的结…

概率论与数理统计,重要知识点——全部公式总结

二、一维随机变量及其分布 五个分布参考另外一篇文章 四、随机变量的数字特征 大数定理以及中心极限定理 六、数理统计

基于SpringBoot+Vue单位考勤系统设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还…

【SkyWalking】使用PostgreSQL做存储K8s部署

拉取镜像 docker pull apache/skywalking-ui:10.0.1 docker tag apache/skywalking-ui:10.0.1 xxx/xxx/skywalking-ui:10.0.1 docker push xxx/xxx/skywalking-ui:10.0.1docker pull apache/skywalking-oap-server:10.0.1 docker tag apache/skywalking-oap-server:10.0.1 xxx…