volatile 实现原理了解吗?

volatile 实现原理了解吗?

volatile 有两个作用,保证可见性有序性

volatile 怎么保证可见性的呢?

简单来说:读取和写入变量从原本的本地内存变成主内存中

相比 synchronized 的加锁方式来解决共享变量的内存可见性问题,volatile 就是更轻量的选择,它没有上下文切换的额外开销成本。

volatile 可以确保对某个变量的更新对其他线程马上可见,一个变量被声明为 volatile 时,线程在写入变量时不会把值缓存在寄存器或者其他地方,而是会把值刷新回主内存 当其它线程读取该共享变量 ,会从主内存重新获取最新值,而不是使用当前线程的本地内存中的值。

当对volatile变量进行写操作的时候,JVM会向处理器发送一条lock前缀的指令,将这个缓存中的变量回写到系统主存中。 所以,如果一个变量被volatile所修饰的话,在每次数据变化之后,值都会被强制写入主存。而其他处理器的缓存由于遵守缓存一致性协议,就会把变量的值从主存读取到自己的工作内存中。这就保证了volatile在并发编程中,其值在多个缓存中是可见的

例如,我们声明一个 volatile 变量 volatile int x = 0,线程 A 修改 x=1,修改完之后就会把新的值刷新回主内存,线程 B 读取 x 的时候,就会清空本地内存变量,然后再从主内存获取最新值。

volatile内存可见性

volatile 怎么保证有序性的呢?

简单来说:禁止指令重排,增加读写相关屏障

重排序可以分为编译器重排序和处理器重排序,valatile 保证有序性,就是通过分别限制这两种类型的重排序。

volatile重排序规则表

  • volatile读之后的任何操作不能重排序到volatile读之前(对应第二行)

    • 这么一个场景,需要根据volatile读出来的数据,进行后续的普通读写操作,若提前了,volatile数据是旧数据,导致语义错误。

    • volatile读之前的任何操作,就肯定不是基于该volatile变量的相关普通操作,所以不需要做相关屏障

  • volatile写之前的任何操作不能重排序到volatile写之后(对应第三列)

    • 这么一个场景,普通读写操作完成后才能更改volatile写操作,volatile写提前,说明还没完成操作你就改。

  • volatile写之后的volatile相关操作不能重排序到前面

    • 相当于对该volatile修饰的变量加锁

为了实现 volatile 的内存语义,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。

  1. 在每个 volatile 写操作的前面插入一个StoreStore屏障

  2. 在每个 volatile 写操作的后面插入一个StoreLoad屏障

  3. 在每个 volatile 读操作的后面插入一个LoadLoad屏障

  4. 在每个 volatile 读操作的后面插入一个LoadStore屏障

  • 巧记:拆分成两个单词,读用Load,写用Store。LoadLoad读读,LoadStore读写·······

volatile写插入内存屏障后生成的指令序列示意图

volatile读插入内存屏障后生成的指令序列示意图

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

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

相关文章

网络原理 IP协议与以太网协议

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 目录 1.网络层 IP协议 1.IP协议格式 2.地址管理 2.1 IP地址 2.2 解决IP地址不够用的问题 2.3NAT网络地址转换 2.4网段划分 3.路由选择…

Unity多国语言支持

Unity多国语言支持 项目在我的课程 ”淘金城堡“ 中应用 项目的地址:http://t.csdnimg.cn/m0hFd 一、基本概念 在Unity中加入多国语言的支持可以让我们发布的游戏或应用上线在拥有不同语言的国家或地区。 下面介绍一款Unity官方提供的插件“Localization package…

FinLex An effective use of word embeddings for financial lexicon generation

FinLex: An effective use of word embeddings for financial lexicon generation 论文阅读 文章目录 FinLex: An effective use of word embeddings for financial lexicon generation 论文阅读 AbstractMethodology具体词表例子LM 词列表与 FinLex 词列表 词列表在分类任务中…

EMT-DAVT--基于子空间分布对齐和决策变量转移的多目标多任务优化

EMT-DAVT–基于子空间分布对齐和决策变量转移的多目标多任务优化 title: Multiobjective Multitasking Optimization With Subspace Distribution Alignment and Decision Variable Transfer author: Weifeng Gao, Jiangli Cheng, Maoguo Gong, Hong L…

FreeRTOS实战指南 — 3.1 C语言链表

目录 1 单向链表 1.1 单链表的概念 1.2 链表增加头结点的作用 1.3 单链表的实现 2 循环链表 3 双向链表 为什么学习链表?FreeRTOS使用链表来管理任务调度,来维护不同优先级的就绪任务;许多内部数据结构,如任务控制块&#x…

机器学习 vs 深度学习:深入浅出解析两者的区别

在当今科技飞速发展的时代,**机器学习(Machine Learning)和深度学习(Deep Learning)**成为了人工智能(AI)领域的热门话题。无论你是技术专家、学生,还是对AI感兴趣的普通读者&#x…

Pointnet++改进57:全网首发SCSA(2024最新注意力机制)|即插即用,提升特征提取模块性能

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入SCSA注意力机制,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤…

搭子app有哪些?找搭子用什么软件?8款找搭子平台清单分享

在这个快节奏的现代社会,人们常常渴望找到志同道合的伙伴,一同分享生活中的喜怒哀乐、探索未知的领域。而找搭子软件的出现,如同璀璨星辰照亮了我们的社交天空。下面就为你带来一份精心整理的找搭子软件清单。 1. 咕哇找搭子小程序&#xff1…

2----手机维修工具 集合解锁 修复参数 刷机支持高通 MTK 展讯等芯片 支持一些PDA设备

这款工具在早些年使用较普遍. 。支持的机型非常多。不但支持国内品牌机型还支持很多国外机。总计多达几百种型号。功能选项较多。唯一的缺点是英文版。需要一定的英文基础的友友使用。支持各类机型修复系统 修复参数 读取信息 备份分区等等。以及一些小品牌机型的root 备份基带…

RT-DETR改进策略:BackBone改进|Swin Transformer,最强主干改进RT-DETR

摘要 在深度学习与计算机视觉领域,Swin Transformer作为一种强大的视觉Transformer架构,以其卓越的特征提取能力和自注意力机制,正逐步引领着图像识别与检测技术的革新。近期,我们成功地将Swin Transformer引入并深度整合至RT-DERT(一种高效的实时目标检测与识别框架)中…

解决iframe嵌套第三方页面被拒绝

背景 很多时候,出于安全考虑,没有第三方页面的允许,我们是无法直接通过iframe去打开别人的第三方页面的,通常他们会通过在页面请求的响应头增加X-Frame-Options (去了解)和Content-Security-Policy (去了解)。 目的 可是有些时…

尚品汇-秒杀商品存入缓存、Redis发布订阅实现状态位(五十一)

目录: (1)秒杀业务分析 (2)搭建秒杀模块 (3)秒杀商品导入缓存 (4)redis发布与订阅实现 (1)秒杀业务分析 需求分析 所谓“秒杀”&#xff0…

I2C/IIC学习笔记

I2C/IIC 有些同学I2C和IIC分不清,I2C和IIC实际上是指同一种通信协议。I2C是Inter-Integrated Circuit的缩写,而IIC是它的另一种表述方式,代表的是同一个意思,即“集成电路间总线”。I2C是一种由飞利浦公司(现恩智浦半…

【题解】【枚举】—— [USACO1.5] 回文质数 Prime Palindromes

【题解】【枚举】—— [USACO1.5] 回文质数 Prime Palindromes [USACO1.5] 回文质数 Prime Palindromes题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示 思路1.素数筛法1.1.思路解析1.2.参考代码 解法1.打表1.1.思路解析1.2.AC代码 解法2.构造回文数2.1.思路解析2.2.…

Matlab Simulink 主时间步(major time step)、子时间步(minor time step)

高亮颜色说明:突出重点 个人觉得,:待核准个人观点是否有误 高亮颜色超链接 文章目录 对Simulink 时间步的理解Simulink 采样时间的类型Discrete Sample Times(离散采样时间)Controllable Sample Time(可控采样时间) Continuous Sample Times(…

基于springboot大学生就业招聘系统的设计与实现

大学生就业招聘系统的设计与实现 摘要 随着信息互联网信息的飞速发展,大学生就业成为一个难题,好多公司都舍不得培养人才,只想要一专多能之人才,不愿是承担社会的责任,针对这个问题开发一个专门适应大学生就业招聘的…

HTML+CSS - 网页布局之多列布局定位

1. 多列布局 CSS中多列布局处理文本内容&#xff0c;特别适合对于长段落或者大量文本进行自动分栏显示 类似于grid分布&#xff0c;但相较之下更加简洁明了 基本语法 <div class"container"><p>这是一些示例文本&#xff0c;当我们使用 column-count…

CGAL GIS 应用 - 从点云到DTM

CGAL GIS 应用 - 从点云到DTM GIS应用中使用的许多传感器(例如激光雷达)都会生成密集的点云。此类应用通常利用更高级的数据结构:例如&#xff0c;不规则三角网(TIN)&#xff0c;它可以作为数字高程模型(DEM)的基础&#xff0c;特别是用于生成数字地形模型(DTM)。 点云也可以通…

SOMEIP_ETS_111: SD_Empty_Entries_Array

测试目的&#xff1a; 验证DUT能够忽略声明了条目数组长度为零的SubscribeEventgroup消息。 描述 本测试用例旨在确保DUT在接收到一个Entries数组长度为零的SubscribeEventgroup消息时&#xff0c;能够正确地忽略该消息&#xff0c;不对其进行解释或响应。 测试拓扑&#x…

移动UI案例:工具类app整套案例

工具类App是指提供各种实用工具和功能的手机应用程序。这些工具可以包括但不限于日历、闹钟、备忘录、翻译、计算器、单位转换、天气预报、地图导航、音乐播放器、相机、视频编辑等。这些工具类App能够帮助用户解决日常生活和工作中的各种问题&#xff0c;提高效率和便利性。 …