首页 > 其他分享 >volatile 实现原理了解吗?

volatile 实现原理了解吗?

时间:2024-09-19 19:20:58浏览次数:13  
标签:线程 屏障 变量 了解 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读插入内存屏障后生成的指令序列示意图

标签:线程,屏障,变量,了解,volatile,内存,原理,排序
From: https://blog.csdn.net/qq_62097431/article/details/142302373

相关文章

  • 修复Windows系统中mt6.dll文件缺失或损坏的问题——了解mt6.dll错误的原因及有效的解
    在使用Windows操作系统时,有时会遇到诸如“找不到mt6.dll”或“mt6.dll已损坏”等错误信息。这些问题可能会阻止应用程序的正常运行,给用户带来不便。本文将探讨这些问题的常见原因,并提供有效的解决方法,帮助用户快速恢复正常操作。原因分析文件缺失:用户可能无意中删除了mt6.......
  • 分布式存储技术如何强化企业数字化转型的可靠性与速度?附技术原理及特点
    在信息化、数字化和智能化快速发展的今天,数据已经成为推动经济社会发展的重要资源。随着5G、云计算、大数据、人工智能等技术的不断进步,数据量呈现爆炸式增长。与此同时,企业对数据的需求也日益增加,无论是用于业务分析、决策支持还是创新服务,数据都是不可或缺的。然而数据的快速增长......
  • 研发工程师的「第一性原理」思维
    回顾复盘五年来的研发经历,愈发认同身边同事强调的“第一性原理”思维,仅做浅浅记录和分享一、定义与理论介绍第一性原理(FirstPrinciples),又称基本原理,是指从最基本的假设和定义出发,通过逻辑推理和演绎得出结论的一种思维方法。它强调对事物的本质和根源进行深入的理解,不受已......
  • js基础之setTimeout与setInterval原理分析
    setTimeout与setInterval概述setTimeout与setInterval是JavaScript引擎提供的两个定时器方法,分别用于函数的延时执行和循环调用。前者的主要思想是通过一个定时器,让函数在计时结束后再执行;后者则是每隔一定的时间,就启动一次函数的执行。从原理来看,两者似乎并不复杂。但由于JavaS......
  • # 利刃出鞘_Tomcat 核心原理解析(十一)-- Tomcat 附加功能 WebSocket -- 3
    利刃出鞘_Tomcat核心原理解析(十一)--Tomcat附加功能WebSocket–3一、Tomcat专题-WebSocket-案例-OnMessage分析1、WebSocketDEMO案例实现流程分析:OnMessage分析2、在项目dzs168_chat_room中,在websocket类ChatSocket.java中,创建publicvoidonMes......
  • Hadoop(二十二)CM Kerberos基本原理
    基于CDP的CM维护Hadoop生态组件CDPClouderaDataPlatform(CDP)是Cloudera公司推出的一个全面的数据平台,它支持在多云环境中部署和管理数据CDP提供了一种统一的方法来管理数据和分析工作负载,无论是在本地、公有云还是私有云环境中CDP包括多种服务和工具,如ClouderaDataHub(CDH)......
  • Hadoop(二十)Yarn工作原理
    Yarn资源调度器Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序一、基础架构YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成二、Y......
  • 【微处理器系统原理与应用设计第十四讲】通用同/异步收发器USART中断模式应用设计
    一、功能需求实现远程串行通信数据的回传确认。微处理器系统构成的测控设备通过USART(串口)与用户设备(上位机)相连。上位机每次发送一个字符后等待测控设备将收到的字符回传到上位机。对于测控设备而言,提供一种回传功能,即收到一个字符就立刻发送出去。二、设计思路管脚PA2和PA3......
  • 【微处理器系统原理与应用设计第十三讲】通用同/异步收发器USART轮询模式应用设计
    USART提供两设备之间的串行双工通信,并支持中断和DMA工作。采用轮询、中断和DMA三种方式进行数据收发。一、功能需求实现远程串行通信数据的回传确认。微处理器系统构成的测控设备通过USART(串口)与用户设备(上位机)相连。上位机每次发送一个字符后等待测控设备将收到的字符回传到......
  • OpenAI 的最强模型 o1 的“护城河”失守?谷歌 DeepMind 早已揭示相同原理
    发布不到一周,OpenAI的最新模型o1的“护城河”似乎已经失守。近日,有人发现谷歌DeepMind早在今年8月发表的一篇论文,揭示了与o1模型极其相似的工作原理。这项研究指出,在模型推理过程中增加测试时的计算量,比简单地扩展模型参数更有效。基于论文中提出的计算最优(comput......