当前位置: 首页 > news >正文

JavaEE之volatile关键字

一.内存可见性问题

什么是内存可见性问题

计算机运行的程序/代码,往往需要访问数据。这些数据往往存在于内存中。

cup使用此变量时,就会把内存中的数据先读出来,加载到cpu寄存器中,再去参与运算。

但是,关键是cpu读取内存的速度非常慢。这是相对的,读内存比读取硬盘快成千上万倍,而读取寄存器又比读取内存快了成千上万倍。而这里,cpu计算时,就是涉及到读取内存和读取寄存器的操作。

读取寄存器非常快,一旦涉及到读内存,cpu就慢下来了。为例提高效率,操作系统就可能在代码逻辑不变的情况下对代码进行优化,把本来读取内存的操作优化成读取寄存器的操作,减少了读取内存的次数,也就提高了效率。但是此时,如果有另一个线程对该数进行了修改并放到内存中,前一个线程就感知不到变化,就会出现问题。这就出现了内存可见性问题,也是线程安全问题的成因之一,明明内存已经修改了值,它却视而不见

例如下面的情况:

明明修改了isQuit的值,但线程1还在循环,说明while中读取到的值还是0,说明没有看到内存的修改,这就是内存可见性问题,是由于多线程引起的。我们来解释一下:

while(isQuit==0)这个判断分为俩步:第一步,load,就是cpu读取内存,将内存中isQuit的值记录到寄存器中;第二步,读取寄存器,判断isQuit的值是否为0(cmp)。

由于只是一个循环,短时间内就会进行大量循环,也就是会进行大量load,cmp操作。但是,此时JVM发现,load一次的时间内,就可以cmp成千上万次,而且发现前几次时,每次load和cmp的结果都是一样的,并且load有费时,所以编译器就做了大胆决定:不再进行load内存,而是直接从寄存器中取出isQuit。

编译器的优化:初心是好的,想要提高工作效率,但没想到其他线程动了手脚,而编译器却察觉不到,所以就做出了错误决定。

其实从上述分析中,我们可以大胆猜测,要是循环慢一点,就可能不会进行优化了,如下:

虽然只休眠了50毫秒,但却正常了,所以编译器到底什么时候触发优化机制,我们无法确定。

关于内存可见性,还涉及到一个JMM(Java Memory Model)Java内存模型这个概念。它时说到了主内存和工作内存,主内存就是我们常说的内存,而寄存器,缓存等统称为工作内存。

如何解决内存可见性问题

上述问题如何解决?我们怎么告诉编译器不要进行优化?

这就引出了volatile关键字

二.volatile关键字

volatile关键字修饰的变量能够保证内存可见性

它是如何保证被修饰的变量时内存可见性的呢?分两方面:一方面,代码在写入或修改ivolatile修饰的变量时,会先改写工作内存中的变量的值,然后会将改后的值从工作内存中刷新到主内存中;另一方面,在读取该变量时,会先将变量从主内存加载到寄存器中,再从寄存器中读取。

也就是说,加上volatile后,会让系统强制读写内存,而不是直接读写寄存器,虽然速度慢了,但时却保证了准确性。

volatile不能保证原子性

他只能让读取内存操作不被优化成读寄存器,而不能将代码捆绑到一起。保证原子性的操作还得是用synchronized

相关文章:

JavaEE之volatile关键字

一.内存可见性问题 什么是内存可见性问题 计算机运行的程序/代码,往往需要访问数据。这些数据往往存在于内存中。 cup使用此变量时,就会把内存中的数据先读出来,加载到cpu寄存器中,再去参与运算。 但是,关键是cpu读…...

代码学习记录10

随想录日记part10 t i m e : time: time: 2024.03.03 主要内容:今天的主要内容是深入了解数据结构中栈和队列,并通过三个 l e e t c o d e leetcode leetcode 题目深化认识。 20. 有效的括号1047. 删除字符串中的所有…...

java——2024-03-03

String类的对象能被修改吗?如果不能需要用什么修改?StringBuilder和StringBuffer的区别?equals和区别谈谈对面向对象的理解重载和重写的区别说一下ArrayList,LinkedList底层实现以及区别什么是哈希冲突?hashMap和conCu…...

Ubuntu安装conda以后,给jupyter安装C++内核

前言 大家都知道,jupyter notebook 可以支持python环境,可以在不断点调试的情况下,打印出当前结果,如果代码错了也不影响前面的内容。于是我就想有没有C环境的,结果还真有。 参考文章: 【分享】Ubuntu安装…...

【谈判】核心思想(抓大放小)

谈判交换(抓大放小) 一、明确目的 事:must: 非要不可,才会签字 want: 有很好, give: 放掉 三者,会变化 二、明确对象 人:我跟谁谈? 时: 国际形势、国家的政策、他的心…...

洛谷P5908 猫猫和企鹅 做题反思(2024.3.7)

猫猫和企鹅 题目传送门 题目描述 王国里有 n n n 个居住区,它们之间有 n − 1 n-1 n−1 条道路相连,并且保证从每个居住区出发都可以到达任何一个居住区,并且每条道路的长度都为 1 1 1。 除 1 1 1 号居住区外,每个居住区住…...

常见的验证码

一、短信验证码 前端: 用户填写手机号,点击按钮发送请求用户短信得到验证码后,用户填写表单提交 form 表单,进行验证 后台: 随机生成几位验证码并将生成时间、手机号、验证码存储起来,可以存到session、…...

11. C语言标准函数库

C语言制定了一组使用方式通用的函数,称为C语言标准函数库,用于实现编程常用功能,标准函数库由编译器系统提供,并按功能分类存储在不同源代码文件中,调用标准库内函数时需要首先使用 #include 连接对应的源代码文件。 【…...

2016年认证杯SPSSPRO杯数学建模C题(第一阶段)如何有效的抑制校园霸凌事件的发生解题全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 C题 如何有效的抑制校园霸凌事件的发生 原题再现: 近年来,我国发生的多起校园霸凌事件在媒体的报道下引发了许多国人的关注。霸凌事件对学生身体和精神上的影响是极为严重而长远的,因此对于这些情况我们应该…...

设计模式-抽象工厂模式实践案例

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式是围绕一个超级工厂创建其他工厂的模式。该模式的实现涉及…...

用readproc函数读取进程的状态

概要&#xff1a; 本篇演示用readproc函数读取进程的状态 libprocps库的安装参考笔者的文章readproc.h-CSDN博客 演示所用的系统是Ubuntu22.04 一、代码 #include<stdio.h> #include<stdlib.h> #include<proc/readproc.h> int main() {struct PROCTAB *…...

在高并发、高性能、高可用 三高项目中如何设计适合实际业务场景的分布式id(一)

分布式ID组件&#xff1a;黄金链路上的关键基石 在现代分布式系统中&#xff0c;分布式ID组件无疑扮演着至关重要的角色。作为整个系统的黄金链路上的关键组件&#xff0c;它的稳定性和可靠性直接关乎到整个系统的正常运作。一旦分布式ID组件出现问题&#xff0c;黄金链路上的…...

redis最新版本在Windows系统上的安装

一、说明 这次安装操作主要是根据redis官网说明&#xff0c;一步步安装下来的&#xff0c;英语比较好的同学&#xff0c;可以直接看文章底部的超链接1&#xff0c;跳到官网按步操作即可。 目前redis的最新稳定版本为redis7.2。 二、Windows环境改造 Redis在Windows上不被官方…...

【深度优先】【图论】【C++算法】2045. 到达目的地的第二短时间

作者推荐 视频算法专题 LeetCode2045. 到达目的地的第二短时间 城市用一个 双向连通 图表示&#xff0c;图中有 n 个节点&#xff0c;从 1 到 n 编号&#xff08;包含 1 和 n&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中每个 edges[i] [ui, vi] 表…...

思维题(蓝桥杯 填空题 C++)

目录 题目一&#xff1a; ​编辑 代码&#xff1a; 题目二&#xff1a; 代码&#xff1a; 题目三&#xff1a; 代码&#xff1a; 题目四&#xff1a; 代码&#xff1a; 题目五&#xff1a; 代码&#xff1a; 题目六&#xff1a; 代码七&#xff1a; 题目八&#x…...

Meta的Llama2模型已上线!但我为何更推荐你从HuggingFace获取?还有Code Llama等你来解锁!

嘿&#xff0c;朋友们&#xff0c;今天给你们介绍一个新东西——Llama2模型&#xff0c;这是Meta&#xff08;对&#xff0c;就是Facebook那家&#xff09;推出的。 你可以直接去Llama的官网下载这个模型&#xff0c;然后按照他们GitHub上的指南来调用。 不过呢&#xff0c;我…...

CAN总线及通讯的工作原理

一、CAN总线 CAN是控制器局域网络(Controller Area Network)的简称&#xff0c; 它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的&#xff0c; 并最终成为国际标准&#xff08;ISO11519&#xff09;&#xff0c;是国际上应用最广泛的现场总线之一。 二、工作原理 …...

linux下修改网卡MAC地址

我建议你使用 macchanger&#xff0c;但如果你不想使用它&#xff0c;那么可以使用另一种方法在 Linux 中更改 MAC 地址。 首先&#xff0c;使用以下命令关闭网卡&#xff1a; sudo ip link set dev enp0s31f6 down 接下来&#xff0c;使用以下命令设置新的 MAC&#xff1a;…...

47、WEB攻防——通用漏洞Java反序列化EXP生成数据提取组件安全

文章目录 序列化和反序列化的概念&#xff1a; 序列化&#xff1a;把java对象转换成字节流的过程&#xff1b;反序列化&#xff1a;把字节流恢复为java对象的过程。 对象的序列化主要有两种用途&#xff1a; 把对象的字节流永久的保存在硬盘上&#xff0c;通常存放在一个文件…...

phpstorm console xdebug

1.所有配置跟浏览器http请求一样 2.记得Current File 必须是controller文件 注意&#xff1a;如果没有出发断点&#xff0c;则echo phpinfo(),查看remote_port 和phpstorm 配置是否对上。...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...