java面试题:voliate底层原理——详解

article/2025/9/19 12:26:44

1. voliate底层原理

1.1 voliate变量的特点

  • 可见性: 当一个线程修改了声明为volatile变量的值,新值对于其他要读该变量的线程来说是立即可见的。
  • 有序性: volatile变量的所谓有序性也就是被声明为volatile的变量的临界区代码的执行是有顺序的,即禁止指令重排序。
  • 受限原子性: volatile变量不可保证原子性

1.2 voliate如何实现变量多线程安全?

  • 实际上,voliate实现多线程情况下的变量安全其实就是通过以下两个方式:
    1)实现变量可见性
    2)禁止指令重排序

1.3 voliate读写变量的过程

  • 写过程: 当一个线程修改某个voliate变量的值的时候,JMM会把该线程对应的本地内存中的共享变量值刷新到主内存。
  • 读过程: 当一个线程读取某个voliate变量的值的时候,JMM会把该线程对应的本地内存置为无效,线程接下来将从主内存读取共享变量。

1.4 voliate可见性底层实现原理

  • 实际上voliate的可见性实现借助了CPU的lock指令,即在写voliate变量的时候,在该指令前加一个lock指令,这个指令有两个作用:

    1)写volatile时处理器会将缓存写回到主内存。
    2)一个处理器的缓存写回到主内存会导致其他处理器的缓存失效。(即其他线程缓存该变量地址失效,下次读取时会自动从主存中读取)

如何通知其他线程的工作内存(缓存)失效

嗅探机制工作原理:每个处理器通过监听在总线上传播的数据来检查自己的缓存值是不是过期了,如果处理器发现自己缓存行对应的内存地址修改,就会将当前处理器的缓存行设置无效状态,当处理器对这个数据进行修改操作的时候,会重新从主内存中把数据读到处理器缓存中。

注意:基于 CPU 缓存一致性协议,JVM 实现了 volatile 的可见性,但由于总线嗅探机制,会不断的监听总线,如果大量使用 volatile 会引起总线风暴。所以,volatile 的使用要适合具体场景。

1.5 voliate有序性底层实现原理

  • volatile有序性的保证就是通过禁止指令重排序来实现的。指令重排序包括编译器和处理器重排序,JMM会分别限制这两种指令重排序。

  • 那么禁止指令重排序又是如何实现的呢?答案是加内存屏障。JMM为volatile加内存屏障有以下4种情况:

在这里插入图片描述

voliate的lock指令其实就相当于加了内存屏障,使用了volatile修饰变量,则对变量的写操作,会插入StoreLoad屏障。

上述内存屏障的插入策略是非常保守的,比如一个volatile的写操作前后需要加上StoreStore和StoreLoad屏障,但这个写volatile后面可能并没有读操作,因此理论上只加上StoreStore屏障就可以,的确,有的处理器就是这么做的。但JMM这种保守的内存屏障插入策略能够保证在任意的处理器平台,volatile变量都是有序的。

  • 总的来看,内存屏障就是在读写的操作前后加入两条指令,禁止指令重排序。但是这种插入策略比较保守,理论上写的后面可能没有读操作的话就只需要在前面加指令即可。

1.6 voliate为什么不保证原子性

首先说明i++的操作本身就不是原子性的,而是分为三步

1、线程读取i
2、i自增,temp = i + 1
3、刷回主存,i = temp

举例说明:
1)当 i=5 的时候A,B两个线程同时读入了 i 的值,
2)然后A线程执行了 temp = i + 1的操作, 要注意,此时的 i 的值还没有变化,
3)此时B线程也执行了 temp = i + 1的操作,注意,此时A,B两个线程保存的 i 的值都是5,temp 的值都是6,
4)然后A线程执行了 i = temp (6)的操作,此时i的值会立即刷新到主存并通知其他线程保存的 i 值失效,
5)此时B线程需要重新读取 i 的值那么此时B线程保存的 i 就是6,同时B线程保存的 temp 还仍然是6, 然后B线程执行 i=temp (6),所以导致了计算结果比预期少了1

也就是说B线程在自增之后(temp = 6),刷回主存之前,重新获取获取到了当前主存中最新的变量值6,但是此时自增操作已经完成了,这时候再重新将temp=6刷回主存,相当于B没有进行自增。

总之,其实voliate对变量的读写是线程安全的,但是变量的操作却不是线程安全的。

参考博客:https://www.jianshu.com/p/d7f78ac13c6a


http://chatgpt.dhexx.cn/article/e5KXI8Rc.shtml

相关文章

FSM有限状态机(三段式)-Verilog实现

一. 状态机理论基础 状态机基本概念: 状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。 以上是标准解释,其实状态机就是为了解决比如IIC协…

Verilog描述有限状态机(一段式、二段式、三段式)

有限状态机(FSM)的输出取决于过去状态以及当前输入,是时序逻辑电路。适合描述那些发生有先后顺序或者有逻辑规律的事情,状态机的本质就是对具有逻辑顺序或时序规律的事件进行描述的一种方法,广泛用于多种场合。 因此&…

以爱情规律为例,浅谈三段式描述状态机

目录 基础概念介绍 状态机的要素 FSM的分类 Verilog描述状态机的方法 一段式描述 两段式描述 三段式描述 结语 基础概念介绍 今夜闲来无事,忽然想到最近准备复习一下Verilog语法,所以就侃一侃状态机吧! 状态机根据状态的数量可以分为两…

三段式状态机-FSM

三段式代码多,但是有时钟同步,延时少,组合逻辑跟时序逻辑分开并行出错少。 (1)同步状态转移 (2)当前状态判断接下来的状态 (3)动作输出 如果程序复杂可以不止三个always 。always 后常接cas…

一段式、两段式和三段式状态机

这里写自定义目录标题 一段式两段式三段式 这张图片是mealy型状态机的结构,Moore型类似,输出与输入无关。 一段式 module moduleName (input clk,input rst_n,input in,output reg [3:0] out );localparam s14d0, s24d1, s34d2, s44d3, s54d4; reg [3:…

FPGA开发基础之三段式状态机

状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,程序的运行其本质也是状态机,根据输入完成输出,得到新的状态。 在平时硬件电路的设计中经常需要用到状态机,例如CPU的取指、译…

关于三段式状态机第三段是组合逻辑还是时序逻辑的问题?

由于本人一直以来,用的三段式状态机,第三段写法都是组合逻辑写法,但是近期有小伙伴面试小公司,写到状态机的第三段时候,按照我一直用到的组合逻辑来写第三段,提供输出,被提出了质疑,…

【状态机设计】Moore、Mealy状态机、三段式、二段式、一段式状态机书写规范

目录 状态机介绍 状态机类型 Moore 型状态机 Mealy 型状态机 状态机设计流程 自动售卖机 状态机设计:3 段式(推荐) 实例 实例 状态机修改:2 段式 实例 状态机修改:1 段式(慎用) 实…

状态机的描述方法案例分析(一段式、二段式、三段式)

上篇博文讲了:FPGA中有限状态机的状态编码采用格雷码还是独热码? 那篇博文讲了状态机的状态编码是用格雷码还是独热码的问题,以及两者之间的优劣。状态机的描述方式采用的是一段式描述方式,也就是将整个状态机全部写到一个always…

FPGA状态机(一段式、二段式、三段式)、摩尔型(Moore)和米勒型(Mealy)

1、状态机 1.1、理论 FPGA不同于CPU的一点特点就是CPU是顺序执行的,而FPGA是同步执行(并行)的。那么FPGA如何处理明显具有时间上先后顺序的事件呢?这个时候我们就需要使用到状态机了。 状态机简写为 FSM(Finite Sta…

三段式状态机_verilog

这是一篇转载的文章,但是个人理解笔者将前两个always块结构搞错了,自行纠正了一下。 原文链接 https://www.jianshu.com/p/5eee434ab24d 1. 三段式要求 有限状态机采用三段式风格,即三个always块描述状态机. 第一个时序逻辑always块用来描…

2021-08-21Verilog三段式状态机的写法,标准示例和仿真。

Verilog三段式状态机的写法,标准示例和仿真。 第一段:同步状态转移。第一个always块格式化描述次态寄存器迁移到现态寄存器。 第二段:当前状态判断接下来的状态。组合逻辑always模块,描述状态转移条件判断用current_state 第三段&…

verilog 3段式状态机

3段式状态机: 3段式状态机写法,写出下图状态转换图。 1 确定输入输出信号,及其类型(是wire还是reg); 2 声明内部信号,一般需要定义current_state和next_state; 3 用3个always语句描…

三段式状态机设计

状态机设计需满足的几个要求: 1. 三段式要求 有限状态机采用三段式风格,即三个always块描述状态机. 第一个组合逻辑always块用来描述下一状态的转移(next state logic) 第二个时序逻辑always块用来描述当前状态.(cur…

三段式状态机浅析

三段式状态机 文章目录 三段式状态机三段式状态机优点书写格式formater整形器状态机书写举例 关注作者 三段式状态机优点 将组合逻辑与时序逻辑分开,所写代码层次清晰,方便理解和后续的维护相较两段式状态机,解决了输出毛刺的影响。 书写格…

(三段式)有限状态机【原理+实例】

状态机的基本要素:输入、输出、状态。 状态机根据状态变化是否与输入条件有关分为两类:即Moore型状态机和Mealy型状态机。 Moore型状态机的状态变化仅和当前状态有关,而与输入条件无关; Mealy型状态机的状态变化不仅和当前状态…

状态机设计(一段式、两段式和三段式)

三段式状态机 第一段,时序always块,状态跳转 第二段,组合always块,状态更新 第三段,时序always块,输出控制 两段式状态机 两段式状态机是把三段式状态机的第二段和第三段合为一段,那么两段式…

FPGA——三段式状态机(1)

状态机全称是有限状态机(Finite State Machine、FSM),是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。状态机可根据控制信号完成预定的状态转换,由组合逻辑电路和寄存器组成,可由状态转换表或状态转…

状态机详解(一段式、二段式、三段式)

一、有限状态机FSM(Finite State Machine) 组成元素: 输入、状态、状态转移条件、输出。 可以分为两类: Mealy状态机:时序逻辑的输出不仅取决于当前状态,还与输入有关; Moore状态机&#xff1a…

三段式状态机理解浅析

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_43070186/article/details/82085463 关于FSM的写法按照always块的个数来划分可以分为一段式…