java并发编程:java内存模型介绍

news2024/11/27 12:39:47

文章目录

  • 并发编程模型的两个关键问题
  • 物理计算机的内存模型
  • 缓存不一致的问题
    • 总线加LOCK#锁的方式
    • 缓存一致性协议
  • Java内存模型


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

线程间如何通信?即:线程之间以何种机制来交换信息

线程间如何同步?即:线程以何种机制来控制不同线程间操作发生的相对顺序

有两种并发模型可以解决这两个问题:

  • 消息传递并发模型
  • 共享内存并发模型

这两种模型之间的区别如下表所示:

image.png

在Java中,使用的是共享内存并发模型

物理计算机的内存模型

大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。

也就是,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。

cpu高速缓存.jpg

当CPU(处理器)要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。一般来说,每级缓存的命中率大概都在80%左右,也就是说全部数据量的80%都可以在一级缓存中找到,只剩下20%的总数据量才需要从二级缓存、三级缓存或内存中读取。

高速缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。高速缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可先缓存中调用,从而加快读取速度。

缓存不一致的问题

虽然高速缓存提高了CPU(处理器)处理数据的速度问题。在多线程中运行就会有问题了。在多核CPU中,每条线程可能运行于不同的CPU中,因此每个线程运行时有自己的高速缓存(对单核CPU来说,其实也会出现这种问题,只不过是以线程调度的形式来分别执行的)。这时CPU缓存中的值可能和缓存中的值不一样,这就会出现缓存不一致的问题。为了解决该问题。物理机算计提供了两种方案来解决该问题。

总线加LOCK#锁的方式

总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束,在计算机中数据是通过总线,在处理器和内存之间传递。

总线机制.png

在早期的CPU当中,是通过在总线上加LOCK#锁的形式来解决缓存不一致的问题。因为CPU和其他部件进行通信都是通过总线来进行的,如果对总线加LOCK#锁的话,也就是说阻塞了其他CPU对其他部件访问(如内存),从而使得只能有一个CPU能使用这个变量的内存。在总线上发出了LOCK#锁的信号,那么只有等待这段代码完全执行完毕之后,其他CPU才能从其内存读取变量,然后进行相应的操作。这样就解决了缓存不一致的问题。

但是上面的方式会有一个问题,由于在锁住总线期间,其他CPU无法访问内存,导致效率低下。所以就出现了缓存一致性协议。

缓存一致性协议

最出名的就是Intel 的MESI协议,MESI协议保证了每个缓存中使用的共享变量的副本是一致的。它核心的思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。

img

Java内存模型

Java线程之间的通信由Java内存模型(简称JMM)控制,从抽象的角度来说,JMM定义了线程和主内存之间的抽象关系。JMM的抽象示意图如图所示:

image.png

从图中可以看出:

  1. 所有的共享变量都存在主内存中。
  2. 每个线程都保存了一份该线程使用到的共享变量的副本。
  3. 如果线程A与线程B之间要通信的话,必须经历下面2个步骤:
  • 线程A将本地内存A中更新过的共享变量刷新到主内存中去。
  • 线程B到主内存中去读取线程A之前已经更新过的共享变量。

所以,线程A无法直接访问线程B的工作内存,线程间通信必须经过主内存。

注意,根据JMM的规定,线程对共享变量的所有操作都必须在自己的本地内存中进行,不能直接从主内存中读取

所以线程B并不是直接去主内存中读取共享变量的值,而是先在本地内存B中找到这个共享变量,发现这个共享变量已经被更新了,然后本地内存B去主内存中读取这个共享变量的新值,并拷贝到本地内存B中,最后线程B再读取本地内存B中的新值。

那么怎么知道这个共享变量的被其他线程更新了呢?这就是JMM的功劳了,也是JMM存在的必要性之一。JMM通过控制主内存与每个线程的本地内存之间的交互,来提供内存可见性保证

Java中的volatile关键字可以保证多线程操作共享变量的可见性以及禁止指令重排序,synchronized关键字不仅保证可见性,同时也保证了原子性(互斥性)。在更底层,JMM通过内存屏障来实现内存的可见性以及禁止重排序。为了程序员的方便理解,提出了happens-before,它更加的简单易懂,从而避免了程序员为了理解内存可见性而去学习复杂的重排序规则以及这些规则的具体实现方法。

参考资料

  • 《Java并发编程的艺术》
  • 《实战Java高并发程序设计》

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

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

相关文章

JavaEE-Servlet(CookieSession)

目录 CookieCookie从哪里来?Cookie到哪里去?Cookie有啥用? SessionServlet中操作 Cookie 和 Session 的APIHttpServletRequest小案例:模拟实现登录功能 HttpServletResponseHttpSessionCookie 类中的相关方法小案例:上…

【深入浅出C#】章节 1:C#入门介绍:C#开发环境的设置和配置

一、环境准备 1.1 安装和配置.NET Core 当配置C#开发环境时,安装.NET Core是一个重要的步骤。以下是安装.NET Core的基本过程: 访问官方网站:打开浏览器,访问.NET Core的官方网站:https://dotnet.microsoft.com/en-u…

【vue】三:核心处理---vue的生命周期

文章目录 1.Vue生命周期的四个阶段,八个钩子2.vue的生命周期图例3. 初始阶段:虚拟DOM生成4. 挂载阶段:真实DOM生成5. 更新阶段:data变化重新渲染6. 销毁阶段:卸载所有,销毁vm 1.Vue生命周期的四个阶段&…

Python+Django人脸识别考勤系统网站

程序示例精选 PythonDjango人脸识别考勤系统网站 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonDjango人脸识别考勤系统网站>>编写代码&#xff0c;代码整洁&#xff0c…

文本分类系统Python,基于深度学习CNN卷积神经网络

一、介绍 文本分类系统&#xff0c;使用Python作为主要开发语言&#xff0c;通过TensorFlow搭建CNN卷积神经网络对十余种不同种类的文本数据集进行训练&#xff0c;最后得到一个h5格式的本地模型文件&#xff0c;然后采用Django开发网页界面&#xff0c;实现用户在界面中输入一…

I.MX6ull 按键抖动消除

1 按键消抖的原理 其实就是在按键按下以后延时一段时间再 去读取按键值&#xff0c;如果此时按键值还有效那就表示这是一次有效的按键&#xff0c;中间的延时就是消抖的。 延时函数实现 会浪费 CPU 性能&#xff0c;因为延时函数就是空跑。 我们可以借助定时器来实现消抖&…

小程序服务器SSL证书替换,访问小程序异常

小程序最近SSL证书过期&#xff0c;访问小程序errno: 600001, errMsg: “request:fail -102:net::ERR_CONNECTION_REFUSED“。 1.在阿里云申请DV证书&#xff0c; DV证书&#xff1a;域名验证型证书&#xff0c;证书审核方式为通过验证域名所有权即可签发证书。 DV证书只验证…

基于Yolov5目标检测的物体分类识别及定位(一) -- 数据集原图获取与标注

从本篇博客正式开始深度学习项目的记录&#xff0c;实例代码只会放通用的代码&#xff0c;数据集和训练数据也是不会全部放出。 系列文章&#xff1a; 基于Yolov5目标检测的物体分类识别及定位&#xff08;一&#xff09; -- 数据集原图获取与标注 基于Yolov5目标检测的物体分类…

【计算机组成原理与体系结构】硬件系统概述

目录 一、计算机的发展 二、计算机的硬件系统 三、硬件的工作原理 四、计算机系统的层次结构 五、计算机的性能指标 一、计算机的发展 第一代计算机&#xff1a;电子管计算机 第一台电子计算机&#xff1a;ENIAC&#xff08;1946&#xff09; 设计目的&#xff1a;计算导弹…

实验篇(7.2) 06. 通过安全隧道访问远端内网服务器 (SSL) ❀ 远程访问

【简介】直接映射服务器到公网&#xff0c;没有验证不安全&#xff1b;通过Web浏览器访问远程内网服务器&#xff0c;有验证也安全&#xff0c;但是支持的协议太少。那有没有即安全&#xff0c;又能支持所有协议的访问方法呢&#xff1f;我们来看看SSL VPN的隧道模式。 实验要求…

基于Yolov5目标检测的物体分类识别及定位(二) -- yolov5运行环境搭建及label格式转换

刚开始跟着网上的教程做&#xff0c;把环境安装错了&#xff0c;后来直接用GitHub的官方教程来安装环境。 地址是yolov5官方团队代码及教程&#xff0c;看readme文件就可以。 系列文章&#xff1a; 基于Yolov5目标检测的物体分类识别及定位&#xff08;一&#xff09; -- 数据集…

【MySQL】一文带你了解表的增删改查 CRUD

文章目录 1. 增加&#xff08;Create&#xff09;1.1 单行插入 全列插入1.2 多行插入 指定列插入 2. 查询&#xff08;Retrieve&#xff09;2.1 全列查询2.2 指定列查询2.3 查询字段为表达式2.4 别名2.5 去重2.6 排序 3. 条件查询&#xff08;Where&#xff09;3.1比较运算符…

【人工智能】— 学习与机器学习、无/有监督学习、强化学习、学习表示

【人工智能】— 学习与机器学习、无/有监督学习、强化学习、学习表示 上一章Bayesian Networks本章&#xff1a;观测学习学习学习元素机器学习概论机器学习对什么有用自动语音识别计算机视觉Information retrieval—信息检索 机器学习机器学习&#xff1a;定义 电子邮件过滤问题…

全志V3S嵌入式驱动开发(gpio输出)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 不管是对mcu&#xff0c;还是对soc来说&#xff0c;gpio肯定是越多越好。但是一个芯片上&#xff0c;它的引脚总是有限的&#xff0c;特别对于非BG…

修改邻接变量-0day漏洞利用原理(6)

大多数情况下,局部变量在栈中的分布是相邻的,但也有可能出于编译优化等需要而有所例外。具体情况我们需要在动态调试中具体对待,这里出于讲述基本原理的目的,可以暂时认为局部变量在栈中是紧挨在一起的。 提供理论基础 下一篇利用:非法的超长密码去修改 bufer 的邻接变量…

支持向量机练习

练习5&#xff1a;支持向量机 介绍 在本练习中&#xff0c;我们将使用支持向量机&#xff08;SVM&#xff09;来构建垃圾邮件分类器。 在开始练习前&#xff0c;需要下载如下的文件进行数据上传&#xff1a; data.tgz -包含本练习中所需要用的数据文件 其中&#xff1a; e…

2. 卷积的经典模型

一、什么是卷积神经网络 卷积神经网络就是含有卷积层的网络。 二、有哪些经典的模型&#xff1f;每一次的技术进步在哪里&#xff1f; 卷积神经网络&#xff08;LeNet&#xff09; LeNet第一次将卷积神经网络推上舞台&#xff0c;通过梯度下降训练卷积神经网络可以达到手写数字…

chatgpt赋能python:Python中取出中间文本的方法

Python中取出中间文本的方法 在Python开发中&#xff0c;我们常常需要从字符串中取出特定位置的文本&#xff0c;例如从一个网页源码中提取出指定的内容。而且&#xff0c;一份好的代码需要清晰易懂、高效可靠。那么&#xff0c;在Python中如何取出中间文本呢&#xff1f;下面…

超详细Redis入门教程——Redis 主从集群(下)

前言 本文小新为大家带来 Redis 主从集群 相关知识&#xff0c;具体内容包括哨兵机制实现&#xff08;包括&#xff1a;哨兵机制简介&#xff0c;Redis 高可用集群搭建&#xff0c;Redis 高可用集群的启动&#xff0c;Sentinel 优化配置&#xff09;&#xff0c;哨兵机制原理&a…

史上最全网络安全面试题汇总

最近有不少小伙伴跑来咨询&#xff1a; 想找网络安全工作&#xff0c;应该要怎么进行技术面试准备&#xff1f;工作不到 2 年&#xff0c;想跳槽看下机会&#xff0c;有没有相关的面试题呢&#xff1f; 为了更好地帮助大家高薪就业&#xff0c;今天就给大家分享一份网络安全工…