JUC 并发编程之JMM
目录
1. 内存模型JMM
1. 1 主内存和工作内存
1.2 重排序
1. 内存模型JMM
Java内存模型是Java虚拟机(JVM)规范中定义的一组规则,用于屏蔽各种硬件和操作系统的内存访问差异,保证多线程情况下程序的正确执行。Java内存模型规定了线程之间如何交互以及线程和内存之间的关系。它主要解决的问题是可见性、原子性和有序性。
-
可见性(Visibility):可见性指当一个线程修改了共享变量的值,其他线程能够立即看到这个修改。如果一个线程对共享变量的修改对其他线程不可见,可能导致数据的不一致性和错误的结果。
-
原子性(Atomicity):原子性是指一个操作是不可中断的,要么全部执行成功,要么全部不执行。在多线程环境下,如果某个操作是非原子性的,可能会导致数据错误或者竞态条件。
-
有序性(Ordering):有序性是指程序执行的顺序与代码的顺序一致。在多线程环境下,由于指令重排和线程间的交互,可能导致指令执行顺序与代码的书写顺序不一致,从而导致错误的结果。
1. 1 主内存和工作内存
在Java内存模型中,主内存(Main Memory)是所有线程共享的内存区域,而每个线程都有自己的工作内存(Working Memory)。线程的工作内存保存了该线程使用的变量的主拷贝副本。
线程在执行过程中,会把需要用到的变量从主内存复制到自己的工作内存中进行操作,然后再将修改后的值刷新回主内存。这种方式可以减少对主内存的访问,提高性能。但是也可能导致可见性问题,即一个线程对共享变量的修改对其他线程不可见。

然后可能遇到的问题如下:

所以JMM中的可见性就是当一个线程修改了某一个共享变量的值,其他线程能够立即看到这个修改。
1.2 重排序
重排序(Reordering)是计算机编程和优化中的一个概念,指的是改变程序中指令执行的顺序,以提高性能或者满足特定的优化需求。重排序在现代计算机系统中是一种常见的优化手段,但同时也可能引发一些潜在的问题。
在编程语言中,由于存在数据依赖性和内存模型的约束,编译器和处理器在执行指令时有一定的自由度来调整指令的执行顺序。这些优化不会改变程序的语义,即程序的行为应该和没有重排序时一致,但可能会影响到程序的可见行为。
重排序主要分为三种类型:
-
编译器重排序(Compiler Reordering):编译器在生成目标代码时可能会根据目标架构的特点进行指令重排,以提高代码的执行效率。编译器重排序通常只在不影响程序语义的情况下进行。
-
处理器重排序(Processor Reordering):现代处理器具有乱序执行的特性,它们可以根据指令之间的数据依赖关系和资源冲突情况,动态调整指令的执行顺序。处理器重排序可以在一定程度上提高指令的执行效率和并行性。
-
内存重排序(Memory Reordering):现代计算机系统中存在多级缓存和乱序执行等特性,这可能导致对内存的读写操作在不同处理器上出现重排序现象。内存重排序可能会导致可见性问题,即一个线程对共享变量的修改对其他线程不可见。

相关文章:
JUC 并发编程之JMM
目录 1. 内存模型JMM 1. 1 主内存和工作内存 1.2 重排序 1. 内存模型JMM Java内存模型是Java虚拟机(JVM)规范中定义的一组规则,用于屏蔽各种硬件和操作系统的内存访问差异,保证多线程情况下程序的正确执行。Java内存模型规定了…...
k8s集群中安装kibana 7.x 踩坑
1. FATAL ValidationError: child "server" fails because [child "port" fails because ["port" must be a number]] 解决办法: 在环境变量中指定端口: - name: SERVER_PORTvalue: 5601 2. Kibana FATAL Error: [elast…...
CSS的一些基础知识
选择器: 选择器用于选择要应用样式的HTML元素。常见的选择器包括标签选择器(如 div、p)、类选择器(如 .class)、ID选择器(如 #id)和伪类选择器(如 :hover)。选择器可以根…...
解决多线程环境下单例模式同时访问生成多个实例
如何满足单例:1.构造方法是private、static方法、if语句判断 ①、单线程 Single类 //Single类,定义一个GetInstance操作,允许客户访问它的唯一实例。GetInstance是一个静态方法,主要负责创建自己的唯一实例 public class LazySi…...
转转闲鱼交易猫源码搭建
后台一键生成链接,独立后台管理 教程:修改数据库config/Conn.php 不会可以看源码里有教程 下载程序:https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3...
设计模式精华版汇总
以下是个人整理的设计模式汇总,将会持续更新工作和面试中经常用到的设计模式。 设计模式-装饰者模式(包装模式)- 案例分析和源码分析 设计模式-代理模式:控制访问的设计模式 - 案例分析 设计模式-门面模式…...
uniapp实现带参数二维码
view <view class"canvas"><!-- 二维码插件 width height设置宽高 --><canvas canvas-id"qrcode" :style"{width: ${qrcodeSize}px, height: ${qrcodeSize}px}" /></view> script import uQRCode from /utils/uqrcod…...
金融行业软件测试面试题及其答案
下面是一些常见的金融行业软件测试面试题及其答案: 1. 什么是金融行业软件测试? 金融行业软件测试是针对金融领域的软件系统进行验证和确认的过程,旨在确保软件在安全、稳定、可靠和符合法规要求的条件下运行。 2. 解释一下金融软件中的风险…...
强化学习QLearning 进行迷宫游戏和代码
强化学习是机器学习里面的一个分支。它强调基于环境而探索行动、学习,以取得最大化的预期收益。其灵感来源于心理学中的行为主义理论,既有机体如何在环境给予的奖励或者惩罚的刺激下,逐步形成对刺激的预期,产生能够最大利益的习惯…...
Vue2 第九节 过滤器
(1)定义:对要显示的数据进行特定格式化后再显示 (2)语法: ① 注册过滤器 1)Vue.filter(name, callback) 全局过滤器 2) new Vue({filters:{}}) 局部过滤器 ② 使用过滤器 1&…...
Swift 对象数组去重
使用 reduce 方法去重 使用 reduce 方法结合 contains 方法可以实现去重。reduce 方法用于将数组的元素进行累积计算,而 contains 方法用于检查元素是否已经存在于结果数组中。 struct SearchRecord: Equatable {let id: Intlet name: String }let records [Sear…...
代码随想录算法训练营day52 300.递增子序列 674.最长连续递增子序列 718.最长重复子数组
题目链接300.递增子序列 class Solution {public int lengthOfLIS(int[] nums) {int[] dp new int[nums.length];Arrays.fill(dp, 1);for(int i 0; i < nums.length; i){for(int j 0; j < i; j){if(nums[i] > nums[j]){dp[i] Math.max(dp[i], dp[j] 1);}}}int r…...
Android 面试题 虚拟机、进程、线程 七
🔥 安卓虚拟机 🔥 虽然Android程序是使用Java语言开发的,当然,现在也可以使用kotlin语言。但是实际上我们开发出来的Android程序并不能运行在JVM上,而是只能运行在一个类似JVM的Android虚拟机上。Android虚拟机有两种&…...
Flutter 状态组件 InheritedWidget
Flutter 状态组件 InheritedWidget 视频 前言 今天会讲下 inheritedWidget 组件,InheritedWidget 是 Flutter 中非常重要和强大的一种 Widget,它可以使 Widget 树中的祖先 Widget 共享数据给它们的后代 Widget,从而简化了状态管理和数据传递…...
<C++> 入门
在学习完C语言的基础上,继续开始C的学习。 C是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C学习有一定的帮助。 1. 补充C语言语法的不足,以及C是如…...
政策加持智能家居市场,涂鸦赋能客户打造“以人为本”智能生活新方式
7月18日,商务部等13部门联合发布了《关于促进家居消费若干措施的通知》(以下简称《通知》),《通知》指出,创新培育智能消费,支持企业运用物联网、云计算、人工智能等技术,着重加快智能家电、智能…...
安全渗透初级知识总结-2
CIA三原则:保密性,完整性,可用性 https:解决了安全传输问题 核心技术:用非对称加密传输对称加密的秘钥,然后用对称秘钥通信 抓包:Wireshark、tshark、tcpdump valueof方法是一个所有对象都拥有的方法&am…...
数学建模的32种常规方法及案例代码
比赛期间整理的数学建模的32种常规方法及案例代码友情分享: 链接:https://pan.baidu.com/s/18uDr1113a0jhd2No8O1Nog 提取码:xae5 在数学建模中,常规算法是指那些被广泛应用于各种问题求解的经典算法。这些算法覆盖了不同的数学…...
【Django+Vue】英文成绩管理平台--20230727
能够满足大部分核心需求(标绿):报表部分应该比较难。 项目地址 前端编译 https://gitlab.com/m7840/toeic_vue_dist Vue源码 https://gitlab.com/m7840/toeic_vue Django源码 https://gitlab.com/m7840/toeic_python 项目架构 流程 …...
栈-模拟栈
实现一个栈,栈初始为空,支持四种操作: push x – 向栈顶插入一个数 x; pop – 从栈顶弹出一个数; empty – 判断栈是否为空; query – 查询栈顶元素。 现在要对栈进行 M 个操作,其中的每个…...
Unity里嵌入一个浏览器?用Embedded Browser插件5分钟搞定H5页面展示与交互
Unity项目快速集成H5页面:Embedded Browser插件实战指南 当Unity项目需要展示动态更新的网页内容时,传统方案往往需要重新开发UI或依赖第三方服务。而Embedded Browser插件提供了一种优雅的解决方案,让开发者能够在Unity中直接嵌入完整的浏览…...
什么是占位符
占位符就是字符串里预留空位,后面填上真实数据,PyCharm里直接写代码就能运行调试1.%格式化占位符(旧式格式化)语法格式:"模板字符串"%(数据1,数据2...)基础类型占位符1.%s :适配字符串…...
Spring Cloud Feign本地调试路由增强方案设计与实现
1. 项目概述:当Feign遇上本地调试的“网络鸿沟”在微服务架构里混迹多年的老手,对OpenFeign这个组件肯定不陌生。它用起来确实爽,一个接口加几个注解,服务间的远程调用就像调用本地方法一样简单,把HTTP通信的复杂性都封…...
Perplexity案例法检索深度解析(工业级RAG系统落地避坑手册)
更多请点击: https://intelliparadigm.com 第一章:Perplexity案例法检索深度解析(工业级RAG系统落地避坑手册) Perplexity作为衡量语言模型预测不确定性的核心指标,在RAG系统中并非仅用于后处理重排序,而是…...
Sunshine游戏串流实战指南:构建跨平台私人云游戏服务器完整方案
Sunshine游戏串流实战指南:构建跨平台私人云游戏服务器完整方案 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否曾经希望将高配置PC上的游戏体验延伸到客厅电视、…...
Anthropic率先盈利:大模型商业化曙光初现,IPO竞争谁能笑到最后?
1. 前沿模型盈利曙光乍现前沿模型公司的利润表终于出现了正数。据《华尔街日报》报道,Anthropic正迎来关键季度,预计2026年第二季度收入超109亿美元,较第一季度的48亿美元增长超一倍,且首次实现季度营业利润。路透社称其二季度预计…...
森林The Forest - 服务器开服
对于想要自建游戏服务器的玩家,云鸢互联是一个不错的专业联机平台选择。它提供稳定、低延迟且724小时在线的服务器环境,助你轻松打造专属游戏世界。平台主打极致的新手友好——全图形化控制面板,无需编写代码,也无需掌握Linux命令…...
加印了!谢谢大家,这本不讲空话的“AI落地说明书”为什么能卖爆?
想不到有一天我也会有“书竟然卖爆了”的感觉,机械工业出版社要紧急加印才能供上货的那种。特别感谢机械工业出版社的朋友们从策划到发布的全程细致高效的工作,感谢微软中国首席技术官韦青老师亲临发布会现场为我们共同的理想发声,更要感谢各…...
B-H 曲线 vs B-P 曲线|磁芯材料两大核心曲线详解
一、B-H 曲线:描述磁芯 “能不能导磁、会不会饱和” 1. 它是什么? 全称:B-H 磁化曲线 定义:磁感应强度 B(单位:T)与磁场强度 H(单位:A/m)的关系曲线 物理意义:反映磁芯材料在磁场中的磁化特性,决定磁导率、饱和磁通密度。 2. 核心作用 计算磁路磁阻、电感值; 判断…...
Unity+C#开发万人MMO服务器的实战架构与同步优化
1. 这不是“写个服务器”那么简单:先撕开“万人在线”的真实含义很多人看到“UnityC#开发万人MMO服务器”这个标题,第一反应是:“哦,用Unity做客户端,C#写个后端,Socket连一连,再加个数据库&…...
