Java中volatile的作用和原理

news2024/11/16 13:49:43

用法

volatile 是 Java 中的关键字,直接修饰成员变量,不能和 final 关键字同时使用。

 private volatile boolean flag = false;

作用

当一个变量被声明为volatile时,它可以确保以下两点:

保证可见性:当一个线程修改了一个volatile变量的值,其他线程会立即看到这个变动。这是因为volatile关键字会禁止CPU缓存和编译器优化,从而确保每次读取变量时都会直接从主内存中获取最新值,而不是从本地缓存中读取。这样可以确保在多线程环境下变量值的实时同步。

保证有序性:volatile关键字还能确保指令的执行顺序不被重排。Java内存模型允许编译器和处理器对指令进行重排序,以提高执行效率。但是,在某些情况下,这种重排序可能导致多线程环境下的数据不一致。volatile关键字可以防止这种情况发生,确保指令执行的顺序符合程序员的预期。

保证内存可见原理

早期计算机中cpu和内存的速度是差不多的,但在现代计算机中,CPU的指令速度远超内存的存取速度,由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲。
将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无须等待缓慢的内存读写了。

基于高速缓存的存储交互很好地解决了处理器与内存的速度矛盾,但是也为计算机系统带来更高的复杂度,因为它引入了一个新的问题:缓存一致性(CacheCoherence)。

为了解决一致性的问题,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来进行操作,这类协议有MSIMESIMOSISynapseFireflyDragonProtocol等。

这里我们关于Intel的MESI说明

MESI(缓存一致性协议)

当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。

至于是怎么发现数据是否失效呢?

总线嗅探机制
每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓存里。

所以当变量被volatile修饰时,当共享变量被线程1修改后,立即写回主内存,同时经过总线,线程2通过总线嗅探机制,将自己工作内存中变量设置为无效状态,当线程2需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。

对于共享变量,每个线程操作数据的时候会把数据从主内存读取到自己的工作内存,如果他操作了数据并且写回了,他其他已经读取的线程的变量副本就会失效了,需要都数据进行操作又要再次去主内存中读取了。

但是Volatile也会导致一些问题,例如总线风暴
由于使用volatile和MESI缓存一致性协议,需要不断的从主内存嗅探和cas不断循环,无效交互会导致总线带宽达到峰值。
所以不要大量使用Volatile,至于什么时候去使用Volatile什么时候使用锁,根据场景区分。

禁止指令重排序原理

什么是指令重排序?
为了提高性能,编译器和处理器常常会对既定的代码执行顺序进行指令重排序。
重排序的类型有哪些呢?源码到最终执行会经过哪些重排序呢?
在这里插入图片描述
那Volatile是怎么保证不会被执行重排序的呢?
内存屏障
java编译器会在生成指令系列时在适当的位置会插入内存屏障指令来禁止特定类型的处理器重排序。

volatile 修饰的变量操作是在前面和后面分别插入内存屏障,而操作是在后面插入两个内存屏障。
在这里插入图片描述
在这里插入图片描述

参考 https://blog.csdn.net/qq_38905818/article/details/105831893

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

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

相关文章

三维天地助力高校实验室数字化智能决策分析

近年来,随着检验检测行业技术的不断发展,高校实验室管理的复杂程度也在不断提高。由于传统的检测实验室日常工作任务繁重、费时费力,存在数据或信息的手动录入、人工计算,纸质文档资料的长期保存,数据快速汇总困难等诸…

大数据面试题:Kafka的Message包括哪些信息

面试题来源: 《大数据面试题 V4.0》 大数据面试题V3.0,523道题,679页,46w字 参考答案: 一个 Kafka 的 Message 由一个固定长度的 header 和一个变长的消息体 body 组成,header 部分由一个字节的 magic&…

Android 12 LED 定制灯效开发小结

文章目录 背景:Android 10 的设备上测试正常Android 12 中目前出现无法闪烁的问题电量变化广播监听总结参考 背景: 在定制的Android 10系统中,通过修改 Framwork 层的代码后,调用标准的接口后,能实现 LED 灯的闪烁灯效…

抖音旋转验证码分析

旋转验证码类型challenge_code为99996, 拿到的旋转验证码通常都是如下: 待旋转的图片: 旋转的背景图: 加密分析过程 可以参考:https://blog.csdn.net/weixin_38819889/article/details/129727564 旋转的难点在于如何…

英国 Tortoise Media发布2023年全球AI指数排名;美团宣布完成收购光年之外

🦉 AI新闻 🚀 美团宣布完成收购光年之外,加强人工智能竞争力 摘要:美团在公告中宣布于2023年6月29日盘后收购光年之外的全部权益,以加强其在快速增长的人工智能行业中的竞争力。光年之外是中国领先的通用人工智能创新…

【ISO26262】汽车功能安全第一部分:术语

【tommi_wei@163.com】 故障响应时间 fault reaction time 从故障(2.42) 探测到进入安全状态(2.102) 的时间间隔。 故障容错时间间隔 fault tolerant time interval 在危害事件(2.59) 发生前, 系统(2.129) 中一个或多个故障(2.42) 可存在的时间间隔。 功能安全 functio…

C语言之网络高级编程笔记

基于Webserver的工业数据采集项目 html cgi Modbus协议 (应用层) 工具:Modus Slave/Poll wireshark Postman 一、Modbus起源 1.起源: Modbus由Modicon公司于1979年开发,是一种工业现场总线协议标准。 Modbus通信协议具有多个变种&#xf…

【Matlab】神经网络遗传算法函数极值寻优——非线性函数求极值

目前关于神经网络遗传算法函数极值寻优——非线性函数求极值的博客资源已经不少了,我看了下来源,最初的应该是来自于Matlab中文论坛,论坛出版的《MATLAB神经网络30个案例分析》第4章就是《神经网络遗传算法函数极值寻优——非线性函数极值寻优…

考研算法35天:三元组的最小距离 【双指针,滑动窗口,多路归并】

算法详解 多路归并;多路归并算法从理论到应用(易懂)_留恋单行路的博客-CSDN博客 多路归并就是将多个已经归并排序排好序的数组再进行排序(不一定是通过归并排序)。 算法题目 这道题就是一般做法是先通过排序将三个数组排好然后再进行三指针求最小。但…

4.23 时域微积分特性

时域微分还有个证明方式 2式两边求导即可推出时域微分特性

ElasticSearch学习01——Windows10环境下ES安装经验与踩到的坑

由于对ES基本概念和历史演进在网上随处可查,所以本文在此不做赘述.随意本文直接讲述如何安装使用ES 1.安装JDK ​ ElasticSearch是基于lucence开发的,也就是运行需要java jdk支持。所以要先安装JAVA环境。由于ElasticSearch 5.x 往后依赖于JDK 1.8的,所…

配置Jenkins的slave agent并使用它完成构建任务

上一章,使用单机配置并运行了一个简单的maven项目,并发布到了一个服务器上启动。这一章将要配置一个slave agent,并将上一章的job放到agent上执行。我们agent使用的是ssh的方式 前置步骤 准备两台虚拟机: 192.168.233.32&#…

4.27 功率谱

功率信号能量一定是无穷大的 1处解释,由于上述信号是截断信号,只有-T/2 ~ T/2有有效信号,因此有了1式 能量信号和能量密度构成傅里叶变换对 功率信号和功率密度构成傅里叶变换对 自相关函数和他的能量谱或者功率谱构成傅里叶变换对

Quiz 12: Regular Expressions | Python for Everybody 配套练习_解题记录

文章目录 Python for Everybody课程简介Regular Expressions单选题(1-8)操作题Regular Expressions Python for Everybody 课程简介 Python for Everybody 零基础程序设计(Python 入门) This course aims to teach everyone the …

CPU acceleration status: KVM requires a CPU that supports vmx or svm

关闭虚拟机,选择处理器将虚拟化引擎第一个选项选上,重新打开虚拟机,进行编译打开模拟器。 source build/envsetup.shlunch aosp_x86_64-engemulator

mesh网格数据解析及cesium绘制格网三角网可视化实现

代码实现运行效果 技术术语 Mesh通常指网络拓扑中的网状结构。在计算机网络中,Mesh是指每个节点都与其他节点相连,形成一个无中心的网状结构。Mesh网络常见于分布式计算、传感器网络、互联网等场景中。另外,在3D计算机图形学中,M…

前端web入门-移动web-day08

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 平面转换 平面转换 transform 平面转换 – 平移 平移实现居中效果 平面转换 – 旋转 平面转换 – 改…

最新特斯拉电机控制器4D1实拍

特斯拉发布过自己的扁线电机,最近Ingineerix大神发布了特斯拉最新动力系统的拆机视频,本篇结合之前的Tesla Model 3 SIC 控制器(控制器具体命名不清楚,以最熟悉的一款车型进行描述我们不妨称之为第二代,第一代为单管IG…

Web安全——JavaScript基础(加入案例)

JavaScript基础 一、概述二、嵌入方法1、内嵌式2、外链式3、行内式 三、语句四、注释五、变量六、JavaScript 保留关键字七、JavaScript 作用域1、JavaScript 局部变量2、JavaScript 全局变量 八、数据类型1、判断类型2、数字类型(Number)3、字符串型&am…

满汉楼项目

满汉楼项目 1. 满汉楼介绍 满汉楼是一个综合餐饮管理系统,其主要分为: 人事登记:各部门人员信息登录管理:员工号、姓名、职位、密码菜谱价格:菜谱及价格报表统计:统计销售额成本及库房:名称注…