Java内存模型(Java Memory Mode,JMM)

news2024/11/29 8:47:28

在这里插入图片描述

并发编程模型的两个关键问题

线程之间如何通信及线程之间如何同步

线程之间如何通信:共享内存,消息传递线程之间如何同步
通信是指线程之间以何种机制来 交换信息同步是指程序中用于控制不同线程间 操作发生相对顺序 的机制
在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在共享内存并发模型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行
在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。
Java的并发采用的是共享内存模型
线程间共享内容线程间不会共享的内容
在Java中,所有实例域、静态域和数组元素都存储在堆内存中,堆内存在线程之间共享。局部变量(Local Variables),方法定义参数(Java语言规范称之为Formal Method Parameters)和异常处理器参数(Exception Handler Parameters)不会在线程之间共享,它们不会有内存可见性问题,也不受内存模型的影响。

Java内存模型的抽象结构 JMM

Java线程之间的通信由 JMM 控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见

JMM定义了线程和主内存之间的抽象关系扩展
线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化

Java内存模型的抽象结构示意图

在这里插入图片描述

JMM的设计意图

程序员角度编译器和处理器角度
让我们来看JMM的设计意图。从JMM设计者的角度,在设计JMM时,需要考虑两个关键因素。
程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程。程序员希望基于一个强内存模型来编写代码编译器和处理器对内存模型的实现。编译器和处理器希望内存模型对它们的束缚越少越好,这样它们就可以做尽可能多的优化来提高性能。编译器和处理器希望实现一个弱内存模型
由于这两个因素互相矛盾,所以JSR-133专家组在设计JMM时的核心目标就是找到一个好的平衡点:一方面,要为程序员提供足够强的内存可见性保证;另一方面,对编译器和处理器的限制要尽可能地放松。
JMM向程序员提供的**happens-before规则能满足程序员的需求**。JMM的happens-before规则不但简单易懂,而且也向程序员提供了足够强的内存可见性保证。JMM对编译器和处理器的束缚已经尽可能少。从上面的分析可以看出,JMM其实是在遵循一个基本原则:只要不改变程序的执行结果(指的是单线程程序和正确同步的多线程程序),编译器和处理器怎么优化都行
JMM对这两种不同性质的重排序,采取了不同的策略
对于会改变程序执行结果的重排序,JMM要求编译器和处理器必须禁止这种重排序。对于不会改变程序执行结果的重排序,JMM对编译器和处理器不做要求(JMM允许这种重排序)。

-----------------------------------------------------------------------------摘自 书名:Java并发编程的艺术 作者:方腾飞;魏鹏;程晓明



在这里插入图片描述

JMM 指定了 Java虚拟机 如何与计算机的 主存(RAM)进行工作

线程和主内存之间的抽象关系

Java的内存模型决定了一个线程对共享变量的写入何时对其他线程可见
Java内存模型定义了线程和主内存之间的抽象关系如下
·共享变量存储于主内存之中,每个线程都可以访问。
·每个线程都有私有的工作内存或者称为本地内存。
·工作内存只存储该线程对共享变量的副本。
·线程不能直接操作主内存,只有先操作了工作内存之后才能写入主内存。
·工作内存和Java内存模型一样也是一个抽象的概念,它其实并不存在,它涵盖了缓存、寄存器、编译器优化以及硬件等。

Jave内存模型与CPU硬件架构的交互图

Java的内存模型是一个抽象的概念,其与计算机硬件的结构并不完全一样,比如计算机物理内存不会存在栈内存和堆内存的划分,无论是堆内存还是虚拟机栈内存都会对应到物理的主内存,当然也有一部分堆栈内存的数据有可能会存入CPU Cache寄存器中。
在这里插入图片描述

引出可见性问题

当同一个数据被分别存储到了计算机的各个内存区域时,势必会导致多个线程在各自的工作区域中看到的数据有可能是不一样的,在Java语言中如何保证不同线程对某个共享变量的可见性

-----------------------------------------------------------------------------书名:Java高并发编程详解:多线程与架构设计 作者:汪文君

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

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

相关文章

网络安全大厂面试题汇总

注:本套面试题,已整理成pdf文档,但内容还在持续更新中,因为无论如何都不可能覆盖所有的面试问题,更多的还是希望由点达面,查漏补缺。 ​ 某大厂一面整理 1、防范常见的 Web 攻击 2、重要协议分布层 3、ar…

c++使用yaml -基于windows10

参考:Windows10下使用VS2017编译和使用yaml-cpp库_雪域迷影的博客-CSDN博客 1. 下载yaml-cpp 建议在github下载其最新的官方版本,不要在其他平台下载该工具软件,下载地址如下(其中的一个版本): Release …

理解深度可分离卷积

1、常规卷积 常规卷积中,连接的上一层一般具有多个通道(这里假设为n个通道),因此在做卷积时,一个滤波器(filter)必须具有n个卷积核(kernel)来与之对应。一个滤波器完成一…

Android自定义键盘(KeyboardView)

目录 1.场景:2.想法:3.开始实现:《一》 在res包下创建xml目录,Keyboard标签来定义键盘布局:《二》创建IKeyboardView类并继承KeyboardView类,设置键盘布局(数字和字母)《三》 处理自定义键盘按键的点击事件…

C++11:列表初始化、新增关键字和新增的默认成员函数

目录 一. 列表初始化 1.1 {}列表初始化的方法 1.2 列表初始化实现的原理 二. C11新增关键字 2.1 decltype -- 自动类型推断 2.2 nullptr -- 空指针 2.3 default -- 强制生成默认成员函数 2.4 delete -- 禁止生成默认成员函数 2.5 final -- 禁止类被继承/禁止虚函数被重…

自动化测试之PageObject设计模式

译文如下: PageObject 当您针对网页编写测试时,您需要参考该网页中的元素以单击链接并确定显示的内容。但是,如果您编写直接操作 HTML 元素的测试用例,则您的测试将无法应对 UI 中的频繁修改。PageObject对应于一个HTML网页、页…

5月26号软件资讯更新合集......

Windows Terminal 1.18 新功能预览:标签拖拽、上下文菜单... Windows Terminal 预览版已更新到 1.18 版本,带来多项实用内容,一起来看看这个版本的新东西: 标签撕裂(拖拽功能) Windows Terminal 已支持对…

安装Redis6

安装Redis 安装redis依赖 redis是基于C语言编写的,因此首选需要安装redis所需的gcc依赖 yum install -y gcc tcl 上传安装包并解压 我安装的是redis-6.2.6版本,并且放到了/usr/local/src目录下 - 进入/usr/local/src目录shellcd /usr/local/src解压 tar …

全球最受欢迎低代码平台排行榜出炉

低代码平台正在成为寻求快速有效地构建应用程序的企业的首选解决方案。这些平台减少了编码要求,使企业能够在降低成本的同时更快地完成应用程序开发项目。在本文中,将探索全球受欢迎的低代码平台排行榜。 该排名使用的标准包括易用性、成本效益、集成性、…

很后悔,才发现这个API管理神器

想必大家都注意到了,近半年国产API管理工具火了起来。这说明两个问题,第一,API管理的重要性被越来越多的开发者认识到了,研发团队对API管理的需求也越来越强了。第二,说明国产软件真是越来越厉害了,大家确实…

《微服务实战》 第十八章 Redis查看配置文件和数据类型

前言 本章节讲解如何查看、修改Redis配置,介绍Redis类型。 1、查看配置 config get 配置名称 2、修改配置项 config set 配置项名称 配置项值 2.1、配置项说明 配置项参数说明daemonizeno/yes默认为 no,表示 Redis 不是以守护进程的方式运行&#xff…

论C站如何获得铁粉?过来人给出几点建议

哈喽,我是bug菌,一名想走👣出大山改变命运的程序猿。周五啦,刚肝完需求的我,闲暇之时逛C站热榜,偶然刷到一条看到官方抛出的话题:"在C站如何获得铁粉?",我寻思…

操作系统第五章——输入输出管理(上)

提示:初入红尘,不知人间疾苦,蓦然回首,已是苦中之人,这杯中酒三分,这酒中悲七分。关关难过关关过,夜夜难熬夜夜熬,愿这人世间所有爱恨情仇皆溶于酒,且将这红尘做酒&#…

MP4如何让去水印?python带你实现~

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 开发环境: 解释器版本: python 3.8 代码编辑器: pycharm 2021.2 模块使用: 内置模块(无需安装) os —> python系统编程的操作模块,提供了非常丰富的功能去处理文件和目录 sys —> 是与…

我是00后,我卷一点怎么了?

前段时间去面试了一个公司,成功拿到了offer,薪资也从12k涨到了18k,对于工作都还没两年的我来说,还是比较满意的,毕竟一些工作3、4年的可能还没我高。 我可能就是大家说的卷王,感觉自己年轻,所以…

手动创建django项目和python虚拟环境

在使用pycharm创建django项目的时候,报错如下: C:\Users\12051\AppData\Local\Temp\tmplkz609ucpycharm-management\setuptools-40.8.0\setup.py install Traceback (most recent call last):File "C:\Users\12051\AppData\Local\Temp\tmpqphl…

合并两个有序链表(java)

leetcode 21题:合并两个有序链表 题目描述解题思路:链表的其它题型。 题目描述 leetcode21题:合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入&…

IO多路转接

目录 一、select 1.1 select初识 1.2 select函数 1.3 scoket就绪条件 1.4 select基本工作流程 1.5 select服务器 1.6 select的优点 1.7 select的缺点 1.8 select的适用场景 二、poll 2.1 poll函数 2.2 poll服务器 2.3 poll的优点 && 缺点 三、epoll 3.1…

设备快线客户端软件V1.0用户手册

1.前言欢迎使用设备快线客户端软件产品。设备快线客户端软件简称DYClient,DYClient客户端是东用科技有限公司推出的一款用于远程维护的控制软件,主要为客户远程访问现场终端设备提供便捷的接入服务,并且通过DYClient客户端软件用户可以非常方便快捷的访问…

ChatGPT和软件测试实践与思考

前言 关于最近大火的ChatGPT相信各位也听过不同渠道听说过他的厉害,目前发展趋势比较火热,科技公司都有在考虑怎么使用ChatGPT进行提高研发效率以及办公效率,最近我所在的公司也有在要求大家使用ChatGPT进行改善工作效率,所以引发…