java中Volatile关键字的原理

在这里插入图片描述

Volitile的主要作用就是保持内存可见性和防止指令重排序。我分别说一下这两个作用的实现原理

1.保持内存可见性的实现原理

volatile内存可见性主要通过lock前缀指令实现的,它会锁定当前内存区域的缓存,并且立即将当前缓存的数据写入到主内存(耗时非常短),回写主内存的时候通过MESI协议,使其他线程缓存了该变量的地址失效,从而导致其他线程需要重新去主内存中重新读取数据到其工作线程中。
那么什么是MESI协议呢?
全称Modified,Exclusive,Shared,Invalid,是一种高速缓存一致性协议,它是为了解决多处理器(CPU)在并发环境下,多个缓存不一致的问题而提出的。
Modified(M–修改):表示缓存已经被修改,但是还没被写回主内存,这种状态下,只有一个CPU能独占这个修改状态。
Exclusive(E–独占):表示缓存与主存储器的数据相同,并且缓存的数据是主存储器的唯一拷贝,在这种状态下,只有一个cpu能独占这个状态
Shared(S–共享):表示此高速缓存可能存储在计算机的其他高速缓存中,并且与主存储器匹配,在这种状态下,各个CPU可以并发的对这个数据进行读取,但是都不能进行写操作。
Invalid(I–失效):表示此缓存已经失效或已经过期,不能使用。
MESI 协议的主要用途是确保在多个 CPU 共享内存时,各个 CPU 的缓存数据能够保持一致性。当某个 CPU 对共享数据进行修改时,它会将这个数据的状态从S(共享)或 E(独占)状态转变为 M(修改)状态,并等待适当的时机将这个修改写回主存储器。同时,它会向其他 CPU 广播一个“无效消息”,使得其他 CPU 将自己缓存中对应的数据状态转变为I(无效)状态,从而在下次访问这个数据时能够从主存储器或其他 CPU 的缓存中重新获取正确的数据。
这种协议可以确保在多处理器环境中,各个 CPU 的缓存数据能够正确、一致地反映主存储器中的数据状态,从而避免由于缓存不一致导致的数据错误或程序异常。

2.有序性实现原理

volatile 的有序性是通过插入内存屏障 (Memory Barrier),在内存屏障前后禁止重排序优化,以此实现有序性的。在 Java 内存模型(JMM)中,volatile 关键字用于修饰变量时,能够保证该变量的可见性和有序性。关于有序性volatile 通过内存屏障的插入来实现:

写内存屏障(Store Barrier/Write Barrier): 当线程写入 volatile 变量时,JMM 会在写操作前插入StoreStore 屏障,确保在这次写操作之前的所有普通写操作都已完成。接着在写操作后插入 StoreLoad 屏障强制所有后来的读写操作都在此次写操作完成之后执行,这就确保了其他线程能立即看到 volatile 变量的最新值。
读内存屏障(Load Barrier/Read Barrier): 当线程读取 volatile 变量时,JMM 会在读操作前插入LoadLoad 屏障,确保在此次读操作之前的所有读操作都已完成。而在读操作后插入 LoadStore 屏障,防止在此次读操作之后的写操作被重排序到读操作之前,这样就确保了对 volatile 变量的读取总是能看到之前对同一变量或其他相关变量的写入结果。

那么什么是内存屏障呢?
内存屏障(Memory Barrier 或 Memory Fence)是一种硬件级别的同步操作,它强制处理器按照特定顺序执行内存访问操作,确保内存操作的顺序性,阻止编译器和 CPU 对内存操作进行不必要的重排序。内存屏障可以确保跨越屏障的读写操作不会交叉进行,以此维持程序的内存一致性模型。

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

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

相关文章

记录dockers中Ubuntu安装python3.11

参考: docker-ubuntu 安装python3.8,pip3_dockerfile ubuntu22 python3.8-CSDN博客

解释“RNN encode-decode”

“RNN encode-decode” 涉及使用循环神经网络(Recurrent Neural Network,RNN)来执行编码和解码操作。这种结构常用于处理序列数据,例如自然语言处理、语音识别和时间序列预测等任务。 以下是 “RNN encode-decode” 的一般概念&a…

西门子PLC常用底层逻辑块分享_单/双输出电磁阀

文章目录 前言一、功能概述二、单输出电磁阀程序编写1.创建自定义数据类型2.创建FB功能块“单输出电磁阀”3.编写程序 三、双输出电磁阀程序编写1.创建自定义数据类型2.创建FB功能块“双输出电磁阀”3.编写程序 前言 本文分享一个自己编写的电磁阀控制逻辑块。 一、功能概述 …

【代码随想录】【二叉树】补day21:二叉搜索树的最小绝对差 、二叉搜索树中的众数 、二叉树的最近公共祖先

最小绝对差 1.申请一个数组,比较两两之间最小的差值 def getresult3(self,node:TreeNode):self.nums[]self.getMinimumDifference(node)mindifferencefloat(inf)for i in range(len(self.nums)-1):mindself.nums[i1]-self.nums[i]if mindifference>mind:mindiff…

流程控制 JAVA语言基础

任何简单或复杂的算法都可以由三种基本结构组成:顺序结构,选择结构,循环结构。 顺序结构 比较一般的结构,程序从上到下执行。 选择结构 我们从最简单的单路选择开始,符合条件的进入语句序列,不符合条件的…

【C++map和set容器:AVL树、红黑树详解并封装实现map和set】

[本节目标] map和set底层结构 AVL树 红黑树 红黑树模拟实现STL中的map和set 1.底层结构 前面对map/multimap/set/multiset进行了简单的介绍,在其文档介绍中发现,这几个容器有个 共同点是:其底层都是按照二叉搜索树来实现的,但…

高并发缓存策略大揭秘:面试必备的缓存更新模式解析

在高并发场景中,缓存能抵挡大量数据库查询,减少数据库压力,对于缓存更新通常有以下几种模式可以选择: cache asideread/write throughwrite behind caching cache aside模式 Cache-aside模式是一种常用的用于管理缓存的模式。它…

RocketMQ学习笔记四(黑马)

课程地址: 1.Rocket第二章内容介绍_哔哩哔哩_bilibili (视频35~88,搭建了一个电商项目) 待学,待完善。

瑞_23种设计模式_策略模式

文章目录 1 策略模式(Strategy Pattern)★1.1 介绍1.2 概述1.3 策略模式的结构1.4 策略模式的优缺点1.5 策略模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析(Comparator) &#x1f64a…

mysql中用逗号隔开的某字段,如何判断其他表的字段值是否在这个字段中

因为要增加需求,需要将线上表中老数据,修改为新数据的规则。 线上两张表,sequence_number中is_use有3作废、2到期状态,需要根据这个状态和school_ai_authorization中的is_deleted修改新增的state字段。 sequence_number表结构&…

温暖如初春:新生儿脸红小贴士

引言: 新生儿脸红是许多父母热切期待的瞬间之一。这种可爱的现象不仅令人陶醉,还可能是宝宝良好健康的标志。然而,在欣喜之余,父母也需要留意脸红背后的可能原因和注意事项,以确保宝宝的舒适和健康。 1. 探寻原因&…

通天星CMSV6 车载视频监控平台 信息泄露漏洞

漏洞描述 通天星CMSV6车载视频监控平台 StandardLoginAction getAlser.acion接口处存在信息泄露漏洞 fofa语句 body"/808gps/" 漏洞复现 打开页面 构造payload POST /808gps/StandardLoginAction_getAllUser.action HTTP/1.1 Host: User-Agent: Mozilla/5.0 (…

ASP.NET区域检验云LIS平台源码 标本全生命周期管理

目录 一、云LIS系统功能亮点 二、收费项目管理 三、检验项目管理 系统功能 云LIS系统源码是一款全面的实验室信息管理系统源码,其主要功能包括样本管理、检测项目管理、质控管理、报告管理、数据分析、两癌筛查等多个方面。具有独立的配套SaaS模式运维管理系统&…

轻量级内网穿透服务-nps

1. NPS概述: NPS(内网穿透代理服务器)是一款由TalentYoung开发的轻量级、高性能的内网穿透代理服务器。它的设计目标是简单易用、功能强大,可以帮助用户在公网上访问内网服务。 NPS支持TCP、UDP、HTTP等多种协议,并提…

翻转时钟效果

时分秒三个部分结构功能完全一致&#xff0c;均有四块构成&#xff0c;上下各两块。 正面可见&#xff0c;背面不可见&#xff0c;同时需要调整翻转过程中的z-index。 初始状态card2为已经翻转状态。 calendar.html <!DOCTYPE html> <html lang"en">&…

非常有用的Python 20个单行代码

有用的 Python 单行代码片段&#xff0c;只需一行代码即可解决特定编码问题&#xff01; 在本文中&#xff0c;云朵君将分享20 个 Python 一行代码&#xff0c;你可以在 30 秒或更短的时间内轻松学习它们。这种单行代码将节省你的时间&#xff0c;并使你的代码看起来更干净且易…

H5 带网站测速引导页源码

源码名称&#xff1a;带网站测速引导页源码 源码介绍&#xff1a;一款带网站测速功能的引导页源码 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.changyouzuhao.cn/10717.html

H5 机器人插件官网源码

源码名称&#xff1a;机器人插件官网源码 源码介绍&#xff1a;一款H5自适应机器人插件官网源码&#xff0c;可自行修改用于各种机器人插件官网。 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.changyouzuhao.cn/10774.html

基于单片机的直流电机调速系统设计

摘 要 在电子机械行业快速发展的今天&#xff0c;各类电子机械类产品以飞快的步伐进入到人们的视野中。为人们的生活带来极大的便利。同时也以各种不同的方式解放着生产力。在这些电子机械领域&#xff0c;电机无疑占着举足轻重的位置。现在各类工厂里的自动化生产线&#xff…

大数据与云计算

目录 一、大数据时代二、云计算——大数据的计算三、云计算发展现状四、云计算实现机制五、云计算压倒性的成本优势 一、大数据时代 我们先来看看百度关于 “大数据”&#xff08;Big Data&#xff09;的搜索指数。 可以看出&#xff0c;“大数据” 这个词是从2012年才引起关注…