voliate关键字

article/2025/9/19 22:15:38

voliate关键字详解:

1.内存模型相关概念

物理计算机内存访问图:
加粗样式
任何计算都是在CPU内处理的,那么也就必须涉及到数据读写,但是CPU每次都要和主内存交互读写数据效率太低了,于是有了高速缓存。在程序运行时,会从主内存中复制一份数据到高速缓存中,然后CPU在高速缓存中读写数据,计算完成后,再将结果从高速缓存中返回到主内存里。
在单线程中,上述操作是不会有问题的,但在多线程中就不行了
例如我们让两个线程都进行a=a+1的操作,按常理来说,结果会是2,但是有一下一种情况:
线程1和线程2都从主内存中读数据到高速缓存中,此时他们读的都是a一开始等于0的情况,然后分别在CPU中运算,线程1完成后,将结果a=1返回到主内存中。线程2完成运算后从高速内存将结果返回,还是a=1。那么结果就是两个线程分别做了加一运算,但是结果为1。
也就是说,一个变量在多个CPU中都有缓存就会出现:缓存不一致问题

2.Java内存模型

JMM(Java Memory Model)图:
工作内存其实是缓存、寄存器、编译器优化等笼统概念。
![是](https://img-blog.csdnimg.cn/449b3e9187ea45e688d9c708855ef8ef.png
Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。
这个图可以和物理计算机内存图类比,也会存在缓存不一致问题,并且Java中没有限制编译器为了提高效率对指令进行重排序,所以也会出现指令重排序问题

2.voliate关键字作用

为了解决Java缓存不一致和重排序问题,于是有了voliate关键字。
当一个共享变量被voliate修饰后

  1. 保证了这个变量再不同线程的可见性,一个线程修改了它,另一个线程立马知道
  2. 禁止指令重排序

前面说了,CPU会在缓存中读写数据,那么加了voliate关键字之后:

  1. 会将结果值立马写入主存
  2. 使其他线程对应变量的缓存无效,所以需要再次去主存中读取

我们用一段代码理解一下:

static class Counter {public int flag = 0;
}
public static void main(String[] args) {Counter counter = new Counter();Thread t1 = new Thread(() -> {while (counter.flag == 0) {// do nothing}System.out.println("循环结束!");});Thread t2 = new Thread(() -> {Scanner scanner = new Scanner(System.in);System.out.println("输入一个整数:");counter.flag = scanner.nextInt();});t1.start();t2.start();
}

t1线程会一直循环,t2线程会让用户输入一个整数,当用户输入0以外的值时,欲使t1线程循环结束。
但是执行结果是:输入5,t1线程仍在循环。
原因就是我们刚才所说的,t1线程一直读取的是工作内存的数据,工作内存中的flag任然是0,它没有意识到主存中flag的值已经为5了。
那么我们给flag用以voliate关键字修饰之后,就不会出现问题了。t2线程修改了flag值后会马上写入主存,t1线程工作内存的flag缓存会马上作废,从主存中读取flag的新值。

voliate不能保证原子性,它保证了内寸可见性和一定程度上的有序性
一定程度上的有序性是什么意思?
就是说加了voliate修饰的变量,对它的值进行修改的代码行相对位置不会变,不会受到指令重排序的影响
比如:
a,b,c,d没有被voliate关键字修饰
flag被voliate关键字修饰了

a=1;
b=2;
flag=5;
c=4;
d=6;

那么flag的位置一定会在a,b和c,d之间夹着。但是a,b的顺序可能调换,c,d的顺序也可能调换,所以是一定程度上的有序性。


http://chatgpt.dhexx.cn/article/1itCkieR.shtml

相关文章

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

1. voliate底层原理 1.1 voliate变量的特点 可见性: 当一个线程修改了声明为volatile变量的值,新值对于其他要读该变量的线程来说是立即可见的。有序性: volatile变量的所谓有序性也就是被声明为volatile的变量的临界区代码的执行是有顺序的…

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…