voliate(轻量级的同步机制)

article/2025/9/19 21:34:12

voliate特点:

JMM内存模型三大特性:可见性,原子性,有序性。

 1.禁止指令重排序:

      voliate实现禁止指令重排,避免多线程环境下程序出现乱序执行的现象。
      多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程中使用的变量能否保证一致性是无法确定的,结果无法预测。
      (初始排序是123,最后排序可能为213,禁止重排后初始和最后排序一致)
      (重排:答题会做的先做,不会的后做,做题顺序和出题顺序不一致)


 2.内存可见性:

       线程首先将变量从主内存拷贝到自己的工作内空间,然后对变量进行操作,操作完再将变量写回主内存;第一时间通知其他线程,第一时间通知的机制就是Java(JMM内存模型)的可见性。


 3.不保证原子性:

       不能保证数据的完整性,会出现写覆盖,数据丢失。
       解决原子性问题
             1.加synchronized
             2.使用juc下面的AtomicInteger;Atomic的底层原理是CAS

 AtomicInteger atomicInteger = new AtomicInteger();public void addMyAtomic(){atomicInteger.getAndIncrement();}


            单例的模式:双端检索机制;在需要单例的对象前加voliate(禁止指令重排)
            
CAS(CompareAndSwap)底层原理:

            比较并交换(比较当前工作内存中的值和主内存中的值是否一样,一样将内存值修改为更新值;如果不一样,重新获得主内存的值继续和工作内存中的值比较,直到一致为止)。
            (getAndIncrement的底层调的是unsafe.getAndAddInt(this,valueOffset,1);this 当前对象;valueOffset:该对象的内存地址;1:需要变动的变量
            这个对象的底层是CAS思想)

var1 AtomicInteger对象本身。
var2该对象值得引用地址。
var4需要变动的数量。
var5是用过var1 var2找出的主内存中真实的值。
用该对象当前的值与var5比较:
如果相同,更新var5+var4并且返回true,
如果不同,继续取值然后再比较,直到更新完成。

假设线程A和线程B两个线程同时执行getAndAddInt操作(分别跑在不同CPU上) :
1.AtomicInteger里 面的value原始值为5,即主内存中AtomicInteger的value为5,根据JMM模型,线程A和线程B各自持有一份值为5的value的副本分别到各自的工作内存。
2.线程A通过getIntVolatile(var1, var2)拿到value值5,这时线程A被挂起。
3.线程B也通过getIntVolatile(var1, var2)方法获取到value值5, 此时刚好线程B没有被挂起并执行compareAndSwapInt方法比较内存值也为5,成功修改内存值为6,线程B打完收工,一切0K。
4.这时线程A恢复,执行compareAndSwaplnt方法比较, 发现自己手里的值数字5和主内存的值数字6不-致,说明该值已经被其它线程抢先一步修改过了,那A线程本次修改失败,只能重新读取重新来一遍了。
5/线程A重新获取value值, 因为变量value被volatile修饰, 所以其它线程对它的修改,线程A总是能够看到,线程A继续执行compareAndSwaplnt进行比较替换,直到成功。
 


CAS的底层就是:Unsafe类+CAS思想(自旋)
        内存值 V
        旧的预期值 A
        要修改的更新值 B
        当且当 (内存值)V == A(预期值), V = B(将内存值修改为B)。

 

 


http://chatgpt.dhexx.cn/article/2Ryn2o1H.shtml

相关文章

voliate工作实际应用场景

哈喽大家好,我是IT老哥,今天我们来讲讲面试必问的voliate 单线程的情况下呢,我们肯定用不到这个voliate 只有在多线程的情景下才能用到,文章结尾我会举一个经典的案例 voliate三特性 保证可见性;不保证复合操作的原子性…

voliate原理

voliate原理 voliate 当使用voliate关键字修饰共享变量(实例变量、静态变量)时,它将具备两个特性:可见性和禁止指令重排序优化 1.可见性 变量被修改后,会立即保存在主存中,并清除工作内存中的值。新值对于线程来说都是可见的…

C语言关键字之voliate

C语言关键字之voliate voliate的作用是作为指令关键字,确保本条指令不会因为编译器的优化而省略,而且要求每次从内存中直接读取值 当使用voliate 声明变量值时,系统总是重新从它所在的内存读取数据,直接访问变量地址&#xff0c…

java中voliate的讲解

Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重…

多线程 - voliate 关键字

介绍 volatile 是 Java 中的关键字,用于修饰变量。它的作用是强制对被修饰的变量的写操作立即刷新到主存中,并强制对该变量的读操作从主存中读取最新的值,而不是使用缓存中的值。 作用 保证变量的可见性: 可见性指的是多个线程…

volatitle

被volatitle修饰的变量能够保证可见性,不保证原子性,每个线程能够获取该变量的最新值。 实现的机制:在写volatitle变量写到主内存时,指令前会加上lock,该指令有两个影响: 将当前处理器缓存行的数据写回系统…

volatile

一、不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它;我们在JDK及开源框架中随处可见这个关键字,但并发专家又往往建议我们远离它。比如…

voliate关键字原理

被volatile修饰的变量在编译成字节码文件时会多个lock指令,该指令在执行过程中会生成相应的内存屏障,以此来解决可见性跟重排序的问题。 预备知识 指令重排序 为什么到指令重排序:一般来说,处理器为了提高程序运行效率&#xff…

voliate关键字

voliate关键字详解: 1.内存模型相关概念 物理计算机内存访问图: 任何计算都是在CPU内处理的,那么也就必须涉及到数据读写,但是CPU每次都要和主内存交互读写数据效率太低了,于是有了高速缓存。在程序运行时&#xff…

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…