首页 > 其他分享 >volatile

volatile

时间:2022-11-06 20:13:37浏览次数:56  
标签:变量 编译器 volatile 内存 寄存器 优化

volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。简单地说就是防止编译器对代码进行优化。
当要求使用volatile声明的变量的值的时候,系统总是重新从它所在的内存读取数据,而不是使用保存在寄存器中的备份。即使它前面的指令刚刚从该处读取过数据。

C/C++ 中 volatile中提到了以下两点:

  • c语言代码中嵌入汇编导致错误:由于刚刚从该处读取过数据A,所以就直接从寄存器中取数据A(gcc的优化策略)。但是内存的中的数据A已经被嵌入的汇编代码所修改了(编译器无法发现这个改变),这就导致得到的数据A和期望的不同。
  • 多线程下的volatile:当两个线程都要用到某一个变量且该变量的值会被改变时,应该用 volatile 声明,该关键字的作用是防止优化编译器把变量从内存装入 CPU 寄存器中。如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误执行。volatile 的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值

标签:变量,编译器,volatile,内存,寄存器,优化
From: https://www.cnblogs.com/codingbigdog/p/16863607.html

相关文章

  • 使用volatile简单实现happen-before功能
    首先解释appen-before,其作用就是保证两个操作的顺序性,特别是多线程中,确保数据的准确性,对于执行顺序会有一定的要求这里引入volatile手动设置 类似的synchronized也可......
  • volatile
     加关键字volatileJava语言包含两种内在的同步机制:同步块(或方法)和volatile变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程......
  • C 语言 volatile 关键字
    《CPrimerPuls》是这样解释关键字的:关键字是C语言的词汇,由于编译器不具备真正的智能,所以你必须用编译器能理解的术语表示你的意图。volatile关键字告诉编译器该变量是......
  • 关于Java的volatile关键字、内存屏障的思考
    内存屏障就是一种屏障指令,在X86架构中,指的是加了“lock前缀”的汇编指令在执行时会让CPU或编译器在对内存进行操作的时候,严格按照一定的顺序来执行。也就是说......
  • 既然CPU有缓存一致性协议(MESI),为什么JMM还需要volatile关键字?
    缓存一致性协议是保证“硬件CPU的cache”和“硬件内存”之间数据的一致性,更详细说也就是缓存一致性协议是保证“物理计算机中的硬件CPUcache”和“物理计算机中的......
  • Lifetime improvement through adaptive reconfiguration for nonvolatile FPGAs
    LifetimeimprovementthroughadaptivereconfigurationfornonvolatileFPGAsSRAM的FPGA有漏电和容量的限制,使用NVM替换SRAM是一个有效的方式,但是NVM有寿命问题。BRAM......
  • volatile
    volatile意为易变加在变量前,告诉编译器这是一个值可能会发生变化的变量,不要进行优化优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动......
  • 深度剖析Java的volatile实现原理,再也不怕面试官问了
    上篇文章我们讲了synchronized的用法和实现原理,我们总爱说synchronized是重量级锁,volatile是轻量级锁。为什么volatile是轻量级锁,体现在哪些方面?以及volatile的作用和实现......
  • 既然CPU有缓存一致性协议(MESI),为什么JMM还需要volatile关键字?
    ​​既然CPU有缓存一致性协议(MESI),为什么JMM还需要volatile关键字?​​​​MESI缓存一致性协议在哪里以及如何实现?​​​​Intel®64andIA-32ArchitecturesDeveloper’s......
  • Volatile关键字的作用
    Volatile关键字的作用主要有如下两个:1.线程的可见性:当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。顺序一致性:禁止指令重排序。一、线程可见性我们先通过一......