Vilatile底层逻辑总结

news/2025/3/19 6:37:05/

#### 增加volatile 使用JIT优化的时候 禁止出现语句重排

  #### volatile是Java虚拟机提供的轻量级同步机制。

  - 保证可见性

  - 不保证原子性(整体流程成功  整体流程失败)如果要保证原子性-加 `synchronized` 或者直接使用 `Automic` 原子类

  - 禁止指令重排(保证有序性)

### Volatile内存屏蔽—防止指令重排

计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排,一般分为以下 3 种:

  #### 原理:

  volatile 可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在 JVM 底层是基于内存屏障实现的。

  - 当对非 volatile 变量进行读写的时候,每个线程先从内存拷贝变量到 CPU 缓存中。如果计算机有多个CPU,每个线程可能在不同的 CPU 上被处理,这意味着每个线程可以拷贝到不同的 CPU cache 中。

  - 而声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步,所以就不会有可见性问题。

    - 对 volatile 变量进行写操作时,会在写操作后加一条 store 屏障指令,将工作内存中的共享变量刷新回主内存;

    - 对 volatile 变量进行读操作时,会在写操作后加一条 load 屏障指令,从主内存中读取共享变量;

  通过 hsdis 工具获取 JIT 编译器生成的汇编指令来看看对 volatile 进行写操作CPU会做什么事情,还是用上边的单例模式,可以看到

  有 volatile 修饰的共享变量进行写操作时会多出第二行汇编代码,该句代码的意思是**对原值加零**,其中相加指令addl前有 **lock** 修饰。通过查IA-32架构软件开发者手册可知,lock前缀的指令在多核处理器下会引发两件事情:

  - 将当前处理器缓存行的数据写回到系统内存(地址改变)

  - 这个写回内存的操作会引起在其他CPU里缓存了该内存地址的数据无效

  **正是 lock 实现了 volatile 的「防止指令重排」「内存可见」的特性**

总结

使用场景

    非原子性场景:直接可以采用-无忧虑

    原子性场景:配合synchronized或者Automic

 性能方面:

        读操作性能损耗忽略

        写操作比`synchronized`要优秀


http://www.ppmy.cn/news/79.html

相关文章

运算符与分支、循环语句

一、运算符 1. 算术运算符 加 减 -乘 *除 /取余 % (开发中经常作为某个数字是否被整除) 2. 赋值运算符 对变量进行赋值的运算符。 -*/% 3. 一元运算符 JavaScript的运算符可以根据所需表达式的个数,分为一元运算符、二元运算符、三元运…

【visual studio】visual studio 2022 无法 复制黏贴

visual studio 2022 cannot copy paste 其他网友也有反馈到微软:VS 2022 Copy and Paste form feature Broken?Copy paste still not fixed in Visual studio 2022表现是突然就无法复制和黏贴了其他的app 就没有这个问题每次都是重启电脑解决。 2022年11月fix 今…

基于FPGA+MPU+MCU全自动血细胞分析仪解决方案

全自动血细胞分析仪是医院临床检验应用非常广泛的仪器之一,用来检测红细胞、血红蛋白、白细胞、血小板等项目。是基于电子技术和自动化技术的全自动智能设备,功能齐全,操作简单,依托相关计算机系统在数据处理和数据分析等方面具有…

xss-labs/level11

首先输入 <script>alert(xss)</script> 丝毫不差 没有出现回弹现象 根本就不出人意料好吧 接着来看一下源代码好吧 能够看得出来第一个输出点由于htmlspecialchars转义操作 所以上述代码根本行不通 这一关比上一关又多了一个隐藏表单 一共是有四个隐藏表单 从…

计算机毕业设计springboot驾校学员管理系统w42sj源码+系统+程序+lw文档+部署

计算机毕业设计springboot驾校学员管理系统w42sj源码系统程序lw文档部署 计算机毕业设计springboot驾校学员管理系统w42sj源码系统程序lw文档部署本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1a;idea eclipse 前…

【数据结构】实验 7 图

目录 【实验目的】 【实验预习】 【实验内容】 1.编写程序&#xff0c;实现图的邻接矩阵存储及图的深度优先搜索和广度优先搜索 2.编写程序&#xff0c;实现图的邻接表存储和拓扑排序算法 3.编写程序&#xff0c;实现带权图的存储、图的最小生成树及单源最短路径算法 …

C语言习题练习11--指针

1.代码结果 #include <stdio.h> int main() {int arr[] {1,2,3,4,5};short *p (short*)arr;int i 0;for(i0; i<4; i){*(pi) 0;}for(i0; i<5; i){printf("%d ", arr[i]);}return 0; } 正常&#xff1a;0001--00 02--00 03--00 04--00 05 数组内部是倒…

iText7高级教程之html2pdf——6.在pdfHTML中使用字体

到目前为止&#xff0c;我们还没有花太多的精力来研究将HTML转换为PDF时使用的字体。我们知道Helvetica是iText在没有指定字体时使用的默认字体&#xff08;第2章&#xff09;&#xff0c;我们知道如果需要嵌入字体&#xff0c;pdfHTML会附带一些内置字体&#xff08;第4章&…