volatile与JMM

news2024/9/22 15:32:34

在这里插入图片描述

目录

  • volatile特点
  • volatile内存语义
  • volatile为什么可以保证可见性和有序性呢?
  • 内存屏障
    • 屏障分类
      • 粗分两种屏障
      • 细分四种屏障
  • volatile特性案例说明
  • 如何正确使用volatile
  • 总结

volatile特点

被volatile修饰的变量有2大特点:可见性和有序性(禁重排)

看见这两个可能会想到JMM中的可见性、有序性、原子性,那么为什么volatile没有原子性呢,这个后面会讲到,在这里先记住,volatile不具备原子性。

可见性:写完后立即刷新回主内存并及时发出通知,大家可以去主内存拿最新版,前面的修改对后面所有线程可见

有序性(禁重排):重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段,有时候会改变程序语句的先后顺序;
不存在数据依赖关系,可以重排序:
存在数据依赖关系,禁止重排序:
但重排后的指令绝对不能改变原有的事行语义!这点在并发设计中必须要重点考虑!

volatile内存语义

当写一个volatle变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中。

当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,重新回到主内存中读取最新共享变量

所以volatile的写内存语义是直接刷新到主内存中,读的内存语义是直接从主内存中读取。

volatile为什么可以保证可见性和有序性呢?

主要是有内存屏障(Memory Barrier)来保证

内存屏障

内存屏障(也称内存栅栏,屏障指令等,是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作),避免代码重排序。内存屏障其实就是一种VM指令,java内存模型的重排规则会要求Java编译器在生成JVM指令时插入特定的内存屏障指令,通过这些内存屏障指令,volatile实现了java内存模型中的可见性和有序性(禁重排),但volatie无法保证原子性。

内存屏障之前的所有写作都要回写到主内存
内存屏障之后的所有读续作都能获得内存屏障之前的所有写操作的最新结果(实现了可见性)。

屏障分类

粗分有两种,写屏障和读屏障
细分有四种

粗分两种屏障

写屏障(Store Memory Barier):在写指令之后插入写屏障,强制把写缓冲区的数据剧回到主内存中

读屏障(Load Memory Barier):在读指令之前插入读屏障,让工作内存或CPU高速缓存当中的缓存数据失效,重新回到主内存中获取最新数据

查看unsafe类
在这里插入图片描述
再往下,看native就需要看c++源码
在这里插入图片描述
在openjdk里面找到unsafe.hpp
在这里插入图片描述
再根据OrderAccess类找,就找到了细分的四种屏障(c++帮我们实现的)
在这里插入图片描述
在这里插入图片描述

细分四种屏障

在这里插入图片描述
看着可能有点懵,但是这种四种屏障可以看做是一种顺序规范,从硬件层面上保证了volatile的有序性,也就是禁止指令重排序,让指令必须按照我的规范去执行。

根据上图,可总结volatile变量被修饰的规则:

  1. 当第一个操作为volatile读时,不论第二个操作是计么,都不能重排序。这个操作保证了volatile读之后的操作不会被重排到volatile读之前

  2. 当第二个操作为volatile写时,不论第一个操作是什么,都不能重排序。这个操作保证了volatile写之前的操作不会被重排到volatle写之后

  3. 当第一个操作为volatile写时,第二个操作为volatile读时,不能重排

volatile特性案例说明

不用volatile修饰,设置的flag无效,main线程修改的值没有被t1线程拿到
在这里插入图片描述

用volatile修饰的变量,一旦修改,后面线程立即从主内存拿到最新数据,程序结束
在这里插入图片描述

如何正确使用volatile

volatile的常用使用场景:

  • 单一赋值,但是含复合运算复制不可以(i++之类),因为在本地工作内存空间中的操作是非原子性的,可能会出现问题

  • 状态标志,判断业务是否结束
    在这里插入图片描述

  • 开销较低的读、写策略
    在这里插入图片描述

  • DCL双端锁的发布,多线程在单例模式下禁止重排序,保证return的是非空
    在这里插入图片描述

总结

volatile可见性:
在这里插入图片描述
volatil有序性:
volatile写之前的操作,都禁止重排序到volatile之后
volatile读之后的操作,都禁止重排序到volatile之前
volatile写之后volatile读,禁止重排序

就先说到这 \color{#008B8B}{ 就先说到这} 就先说到这
在下 A p o l l o \color{#008B8B}{在下Apollo} 在下Apollo
一个爱分享 J a v a 、生活的小人物, \color{#008B8B}{一个爱分享Java、生活的小人物,} 一个爱分享Java、生活的小人物,
咱们来日方长,有缘江湖再见,告辞! \color{#008B8B}{咱们来日方长,有缘江湖再见,告辞!} 咱们来日方长,有缘江湖再见,告辞!

在这里插入图片描述

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

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

相关文章

nginx even块的配置

events 块是 Nginx 配置文件 (nginx.conf) 中的重要部分,用于配置与事件处理相关的参数。它主要定义了 Nginx 服务器如何处理客户端连接,以及控制工作进程的行为。这些配置对于优化服务器性能和稳定性至关重要。 accept_mutex 设置Nginx网络连接序列化 …

leetcode-二分查找算法总结

最朴素二分查找算法: 最朴素二分查找算法: 最基础的一道题:基于有序数组的二分查找--. - 力扣(LeetCode) 基本流程: 1:实际上二分查找不一定非得要有序,能否使用二分查找的关键是是否具有二段性. 2:基于有序数组的二分查找算…

jetbrains 、IntelliJ IDEA、PyCharm 等工具英语音译读音

本心、输入输出、结果 文章目录 jetbrains 、IntelliJ IDEA、PyCharm 等工具英语音译读音前言jetbrains 、IntelliJ IDEA、PyCharm 等工具英语音译读音jetbrains 、IntelliJ IDEA、PyCharm 等工具英语音译读音 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csdn.net/qq_…

谷粒商城实战笔记-55-商品服务-API-三级分类-修改-拖拽数据收集

文章目录 一,拖拽后结点的parentCid的更新二,拖拽后结点的父节点下所有结点的sort排序属性的变化更新排序的逻辑代码分析 三,拖拽后结点及其子节点catLevel的变化判断是否需要更新 catLevel获取拖动后的新节点 更新 catLevel完整代码 这一节的…

服务器数据恢复—V7000存储硬盘故障脱机的数据恢复案例

服务器存储数据恢复环境: 某品牌P740小型机AIXSybaseV7000磁盘阵列柜,磁盘阵列柜中有12块SAS机械硬盘(其中包括一块热备盘)。 服务器存储故障: 磁盘阵列柜中有一块磁盘出现故障,运维人员用新硬盘替换掉故障…

【安当产品应用案例100集】003-基于SSL VPN架构,通过ASP Radius认证机制强化远程办公

SSL VPN远程安全接入技术,想必大家都已有所耳闻。简而言之,这项技术允许你在家中或其他远程位置,通过安全、可靠的途径访问公司内部的网络资源,从而实现无缝、无差别的远程办公体验。它作为企业远程访问的优选方案,其简…

SpringBoot热部署重启关闭(DevTools)

一、DevTools依赖 1、DevTools简介 在Spring Boot项目中,spring-boot-devtools模块提供了多种开发时的便利功能,其中最显著的是restart和livereload特性,它们分别用于应用代码的热重启和前端资源的即时重载。 devtools依赖: &l…

UCOSIII 时间片轮调度接口OS_SchedRoundRobin详解

时间片轮调度(Round-Robin Scheduling)是一种常见的任务调度算法,它将CPU时间片均匀地分配给每个任务,确保每个任务在一定时间内能够获得CPU资源。这种调度方式适用于需要公平分配CPU时间的系统,特别是在有多个相同优先…

叶再豪老师-【番外篇-主升三域】课程

文章目录 1.番外篇1.1番外篇:【道篇】1.1.1 课程目录1.1.2 大道至简1.1.3 欲速则不达,见小利则大事不成1.1.4 强弱转换规律1.1.5 创战法以和道,成为简单快乐的投资者1.1.6 融合道,服务众生,离苦得乐 1.2 番外篇:【势篇】1.2.1 顺势…

Adobe国际认证详解-从零开始学做视频剪辑

从零开始学做视频剪辑,是许多初学者面临的挑战。在这个数字媒体时代,视频剪辑已经成为一种重要的技能,无论是个人爱好还是职业发展,掌握视频剪辑技能都是非常有价值的。 视频剪辑,简称“剪辑”,是视频制作过…

maven archetype

1.简介 maven脚手架是为了创建一个项目模板&#xff0c;以后新建项目都能够复用该模板 maven中模板引擎使用的是velocity,在文件中可以使用它的语法获取变量等操作 2.实现 单模块脚手架实现 pom.xml <?xml version"1.0" encoding"UTF-8"?> &…

无人机之起飞过程操作

一、开启无人机电源 1、开启电源时&#xff0c;再次确认无人机各个部件工作正常&#xff0c;传感器未被遮挡&#xff1b; 2、将无人机放置在平坦的地面上&#xff0c;并开启电源。 二、进行预起飞检查 1、通过无人机的控制系统执行预起飞检查&#xff0c;包括检测罗盘、GPS…

【Unity2D 2022:UI】无法拖拽TextMeshPro组件

在预制体Card上挂载了四个Text Mesh Pro组件&#xff0c;分别命名为Name、HP、ATK、Description。 将预制体Card挂载脚本CardDisplay用来在预制体上显示属性&#xff0c;并创建TextMeshPro对象来接收TextMeshPro组件。 using TMPro; using UnityEngine; using UnityEngine.UI;…

Air780EP模块 LuatOS开发-MQTT接入阿里云应用指南

简介 本文简单讲述了利用LuatOS-Air进行二次开发&#xff0c;采用一型一密、一机一密两种方式认证方式连接阿里云。整体结构如图 关联文档和使用工具&#xff1a;LuatOS库阿里云平台 准备工作 Air780EP_全IO开发板一套&#xff0c;包括天线SIM卡&#xff0c;USB线 PC电脑&…

Harmony Next -- 通用标题栏:高度自定义,可设置沉浸式状态,正常状态下为:左侧返回、居中标题,左中右均可自定义视图。

hm_common_title_bar OpenHarmony三方库中心仓&#xff1a;https://ohpm.openharmony.cn/#/cn/detail/common_title_bar 介绍 一款通用标题栏&#xff0c;支持高度自定义&#xff0c;可设置沉浸式状态&#xff0c;正常状态下为&#xff1a;左侧返回、居中标题&#xff0c;左…

uniapp的h5,读取本地txt带标签的文件

效果图 使用的回显的标签是u-parse&#xff0c;下面的网址讲了这个标签的相关 https://www.cnblogs.com/huihuihero/p/12978903.html 导入此插件 https://ext.dcloud.net.cn/plugin?id364 使用 uni.request({// 本地文件url: "/static/互联网医院医师端用户协议.txt…

初学C++30道选择题带答案(1)

题目 (31) 下面程序的输出是 A) 0 0 3 B) 0 1 2 C) 1 0 3 D) 1 1 2 #include <iostream> using namespace std; main() { int a-1,b4,k;k(a<0)&&(!(b--<0)); cout<<k<<a<<b;} (32)以下…

Nginx 怎样处理请求的并发控制?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 Nginx 怎样处理请求的并发控制&#xff1f;一、并发控制的重要性二、Nginx 中的并发连接限制三、Nginx 的请求队列四、Nginx 的限流机制五、Nginx 的负载均衡策略…

TypeScript中Interface接口的深度探索与实践

定义接口 在TypeScript中&#xff0c;interface是一个强有力的概念&#xff0c;它用于定义类型签名&#xff0c;特别是对象的结构。接口可以用来描述对象应该有哪些属性、方法&#xff0c;以及这些成员的类型。它们是实现类型系统中“鸭子类型”&#xff08;duck typing&#…

小试牛刀-区块链WalletConnect协议数据解密

目录 1.编写目的 2.工作原理 3.分析过程 3.1 websokcet连接 3.2 连接后的消息 3.3 获取sym_key 3.4 解密数据 Welcome to Code Blocks blog 本篇文章主要介绍了 [WalletConnect协议数据解密] ❤博主广交技术好友&#xff0c;喜欢文章的可以关注一下❤ 1.编写目的 最近在…