Java内存模型-Java Memory Model(JMM)-可见性、原子性、有序性
5. Java内存模型之JMM
5.1 先从大场面试开始
你知道什么是Java内存模型JMM吗?
JMM和volatile他们两个之间的关系?
JMM没有那些特征或者它的三大特征是什么?
为什么要有JMM,它为什么出现?作用和功能是什么?
happens-before先行并发原则你有了解过吗?
5.2 计算机硬件存储体系


5.3 Java内存模型Java Memory Model
JMM(Java内存模型Java Memory Model)本身是一种抽象的概念并不真实存在,它仅仅描述的
是一组约定或规范,通过这组规范定义了程序中(尤其是多线程)各个变量的读写访问方式并决定
一个线程对共享变量的写入以及如何变成对另一个线程可见,关键技术点都是围绕多线程的原子
性、可见性和有序性展开的。
能干吗?
-
通过JMM来实现线程和主内存之间的抽象关系
-
屏蔽各个硬件平台和操作系统的内存访问差异以实现让Java程序再各种平台下都能达到一致性的内存访问效果。

5.4 JMM规范下三大特性
可见性:是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道该变更,
JMM规定了所有的变量都存储在主内存中。

系统中主内存共享变量数据修改被写入的时机是不确定的,多线程并发下很可能出现“脏读”,所以
每个线程都有自己的工作内存,线程自己的工作内存中保存了该线程使用到的变量的主内存副本拷
贝,线程对变量的所有操作(读取、赋值等)都必须在线程自己的工作内存中进行,而不能够直接
写入主内存中的变量,不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递
均需要通过主内存来完成。
但是如果不加原子性,会出现“线程脏读”

原子性:指一个操作是不可被打断的,即多线程环境下,操作不能被其他线程干扰
有序性:对于一个线程的执行代码而言,我们总是习惯性地认为代码的执行总是从上到下,有序执
行。但为了提升性能,编译器和处理器通常会对指令序列进行重新排序。Java规范规定JVM线程内
部维持顺序化语义,即只要程序的最终结果与它顺序话执行的结果相等,那么指令的执行顺序可以
与代码顺序不一致,此过程叫指令的重排序。

5.5 JMM规范下多线程对变量的读写过程
由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有的地方成
为栈空间),工作内存是每个线程的私有数据区域,而Java内存模型中规定所有变量都存储在主内
存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读写赋值等)必须在工
作内存中进行,首先要将变量从主内存拷贝到线程自己的工作内存空间,然后对变量进行操作,操
作完成后再将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存存储着主内
存中的变量副本拷贝,因此不同的线程无法访问对方的工作内存,线程间的通信(传值)必须通过
主内存来完成,其简要访问过程如下图:

JMM定义了线程和主内存之间的抽象关系:
- 线程之间的共享变量存储在主内存中(从硬件角度讲就是内存条)
- 每个线程都有一个自己的本地工作内存,本地工作内存中存储了该线程用来读写共享变量的副本(从硬件角度来说就是CPU的缓存)
总结:

相关文章:
Java内存模型-Java Memory Model(JMM)-可见性、原子性、有序性
5. Java内存模型之JMM 5.1 先从大场面试开始 你知道什么是Java内存模型JMM吗? JMM和volatile他们两个之间的关系? JMM没有那些特征或者它的三大特征是什么? 为什么要有JMM,它为什么出现?作用和功能是什么…...
基于Springboot实现在线答疑平台系统项目【项目源码+论文说明】
基于Springboot实现在线答疑平台系统演示 摘要 社会的发展和科学技术的进步,互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大师生的喜爱,也逐渐进入了每个学生的使用。互联网具有便利性,速度快,效率高,成本…...
前端工程化知识系列(1)
目录 1. 什么是前端工程化,以及它为前端开发带来了哪些好处?2. 你使用过哪些版本控制系统?描述一下你在团队中如何处理代码合并和冲突解决的经验。3. 什么是Git,它的工作原理是什么?可以解释一下常用的Git命令吗&#…...
xml文件报错 ORA-00907: 缺失右括号
原来的sql 更改之后 加一个select * from ()...
VScode platformio的使用
一、platformio 工程创建 打开vscode界面你会发现左下多了个家的小图标,点击这里就可以进入platformio。 在右侧Quick Access栏中,有4个选项。可以看得出来,我们这里直接点击创建一个新的工程。 点击New Project打开project配置界面&#x…...
transformer_01
一、传统RNN存在的问题 1.序列前序太长,每个xi要记住前面的特征,而且一直在学,没有忘记,可能特征不能学的太好 2.串行,层越多越慢,难以堆叠很多层; 3.只能看到过去,不能看到未来 搞…...
JavaSE入门---认识方法
文章目录 什么是方法?方法定义实参和形参的关系没有返回值的方法 方法重载方法签名 什么是方法? 在编程中某段功能的代码可能频繁使用到,如果在每个位置都重新实现一遍,会有一些缺点,比如: 使程序变得繁琐…...
编译[Bug]——too few arguments for template template parameter “Tuple“ detected
项目场景: 当使用高版本的cuda去安装低版本pytorch,并且编译用低版本pytorch写的cuda算子时,或者说是VS的版本过高如2022和2019,都有可能会出现某个.h文件或者.c文件报错,如: error: too few arguments f…...
网工内推 | 南天软件,base北京,需持有CCIE认证,最高25k
01 北京南天软件有限公司 招聘岗位:IPT运维工程师 职责描述: 负责客户Cisco语音网络IPT ,CUCM的日常运维,扩容和项目支持,支持路由交换,无线等项目,实施工作以及相关实施文档。 任职要求: 1、…...
Unity有限状态机的简易实现
本人嘴笨,不会说。 该代码实现一个功能较为齐全的有限状态机,可用于大部分的应用场景。 大致实现几个功能 状态更新状态转换状态消息处理全局状态转换和反转状态(转换为前一个状态) 代码分为 状态类状态管理类枚举(…...
什么是NetApp的DQP和如何安装DQP?
首先看看什么是DQP,DQPDisk Qualification Package,文字翻译就是磁盘验证包。按照NetApp的最佳实践,要定期升级DQP包,保证对最新磁盘和磁盘扩展柜的兼容。 本文主要介绍7-mode下如何升级DQP,至于cluster mode另外文章…...
Vue之Vue的介绍安装开发实例生命周期钩子
博主心得: keyup必须与change一起使用v-on.click可以直接写成clickclick“setVal”里的setVal换成数字之后有惊喜VS Code是真的狗,一些报错根本不会直接显示总结:VS code太狗了 1.vue介绍 1.1 什么是vue vue是一个构建用户界面UI的渐进式jav…...
【计网】计算机网络概述
目录 一、计算机网络的概念 二、计算机网络的组成 1、从组成部分上看 2、从工作方式上看 3、从功能组成上看 三、计算机网络的功能 1、数据通信 2、资源共享 3、分布式处理 4、提高可用性 5、负载均衡 四、计算机网络的分类 1、按分布范围 1.广域网 2.城域网 3.…...
初识Java 14-1 测试
目录 测试 单元测试 JUnit 测试覆盖率 前置条件 断言 Java提供的断言语法 Guava提供的更方便的断言 契约式设计中的断言 DbC 单元测试 Guava中的前置条件 本笔记参考自: 《On Java 中文版》 测试 ||| 如果没有经过测试,代码就不可能正常工作…...
react常用的hooks有哪些?
React常用的Hooks包括以下几种: 1.useState:用于在函数组件中创建和管理状态。它返回一个数组,第一个值是当前状态的值,第二个值是更新状态的函数。 使用时,首先通过解构赋值获取状态值和更新函数,并设置初…...
Nacos config 配置中心详解
目录 一、Nacos启动 1.预备环境准备 2.下载编译后压缩包方式 3. 启动服务器 二、 配置管理 多配置格式编辑器 编辑DIFF 示例代码 监听者查询 配置的版本及一键回滚 命名空间管理 登录管理 修改默认用户名/密码方法 关闭登录功能 会话时间 三、启动配置管理 添加依赖:…...
C++ UDP通信
#pragma once #ifndef XUDP_H #define XUDP_H#ifdef WIN32 #include <windows.h> #define socklen_t int #else #include <arpa/inet.h> #define closesocket close //替换close函数 #include <unistd.h>#include<iostream> #endifclass XUdp { pub…...
自由程序员想接私活?那你还不得知道这几个接单平台!最后一个就是宝藏!!
相信喜欢搞钱的程序员都知道,平常在平台上接点私活,利用闲暇时间接单是搞钱的常用套路,可是你确定你选对平台了吗?不管你是刚准备接单的小白,还是已经干了一段时间的老油条,都建议你看完本期文章࿰…...
二叉树与递归的相爱相杀
数据结构之二叉树 一、基于二叉树的基础操作1.二叉树的构建2.二叉树的遍历①前序遍历(深度遍历)②中序遍历③后序遍历④层序遍历判断一棵二叉树是否是完全二叉树(基于层序遍历的思想) 3.二叉树的数量问题①求二叉树结点个数②求二…...
Docker 安装 reids
docker run -itd --name myredis -p 6379:6379 redis --requirepass “123456” --restartalways --appendonly yes...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
