volatile关键字——摸鱼の随笔

简介: 关键字volatile 和 const 一样是类型修饰符,修饰的变量表示可以被某些编译器未知的因素更改(操作系统,硬件,其他线程),编译器不对该数据做优化,特殊地址可访问。

关键字volatile 和 const 一样是类型修饰符,修饰的变量表示可以被某些编译器未知的因素更改(操作系统,硬件,其他线程),编译器不对该数据做优化,特殊地址可访问。


volatile作用🤔

在一般程序运行时,运算一般会交给 CPU 处理,CPU存在运算和控制两个作用,而运算又分为逻辑运算和算术运算。实际场景使用判断时比如 while 语句的条件,就会交给 CPU 逻辑判断,是真返回1继续是真返回1再继续,而 CPU 会默认对数据进行优化,所谓的优化实质上是一种“内存覆盖”,防止优化。

image.png

为了判断时不用去代码中读取,CPU 会每次直接从寄存器里面的读取条件,从代码层面讲其实 CPU 根本就没有再去读取数据,在汇编层面上CPU会自己跳转自己。


但是一但涉及出现另一个逻辑改变了 while 里面条件的值(多线程逻辑是并行的),此时 CPU 依然会在寄存器里面拿到原来条件的值,导致结果异常。volatile 就是防止这种情况进行一个内存的覆盖。


应用场景🤔

以Linux为例:

image.png

分析一下汇编代码


mov:将 pass 放入 exa


test:测试,这里是自己与自己测试(按位与,按位或等)


jne:jump not equals zero,测试结果不为0跳转到相关地址40040d


jmp:跳转到40040d(这里就是自己跳转到自己)


总结一下,volatile就是保持内存可见性!保证每次数据都从内存读取

相关文章
|
1月前
|
C语言
【C语言】return 关键字详解 -《回家的诱惑 ! 》
`return` 关键字在 C 语言中用于终止函数的执行,并将控制权返回给调用者。根据函数的类型,`return` 还可以返回一个值。它是函数控制流中的重要组成部分。
75 2
|
8月前
|
存储 缓存 安全
面试官:小伙子,能聊明白JMM给你SSP!我:嘚吧嘚吧一万字,直接征服面试官!
面试官:小伙子,能聊明白JMM给你SSP!我:嘚吧嘚吧一万字,直接征服面试官!
56 1
|
8月前
|
JavaScript 前端开发 Java
万万没想到,'this'关键字的真正威力
万万没想到,'this'关键字的真正威力
64 1
|
8月前
|
存储 编译器 C#
救命!揭秘C关键字,小白也能变大神
救命!揭秘C关键字,小白也能变大神
44 3
|
设计模式 JSON 监控
趣谈装饰器模式,让你一辈子不会忘
来看这样一个场景,上班族大多有睡懒觉的习惯,每天早上上班都时间很紧张,于是很多人为了多睡一会儿,就用更方便的方式解决早餐问题,有些人早餐可能会吃煎饼。煎饼中可以加鸡蛋,也可以加香肠,但是不管怎么加码,都还是一个煎饼。再比如,给蛋糕加上一些水果,给房子装修,都是装饰器模式。
138 0
|
存储 安全 Java
彻底理解 volatile 关键字及应用场景,面试必问,小白都能看懂!
彻底理解 volatile 关键字及应用场景,面试必问,小白都能看懂!
592 0
彻底理解 volatile 关键字及应用场景,面试必问,小白都能看懂!
|
存储 算法 编译器
深剖关键字(跑路人笔记2)
深剖关键字(跑路人笔记)
深剖关键字(跑路人笔记2)
深夜!小胖问我,什么是自旋锁?怎么使用?适用场景是啥?
深夜!小胖问我,什么是自旋锁?怎么使用?适用场景是啥?
深夜!小胖问我,什么是自旋锁?怎么使用?适用场景是啥?
|
编译器 Linux C语言
深剖关键字(跑路人笔记1)
深剖关键字(跑路人笔记)
|
存储 安全 Java
面试必问的 volatile 关键字,通俗易懂,看完还不懂你打我
Java内存模型 Java内存模型由Java虚拟机规范定义,用来屏蔽各个平台的硬件差异。简单来说: 所有变量储存在主内存。 每条线程拥有自己的工作内存,其中保存了主内存中线程使用到的变量的副本。 线程不能直接读写主内存中的变量,所有操作均在工作内存中完成。 线程,主内存,工作内存的交互关系如图。
115 0
面试必问的 volatile 关键字,通俗易懂,看完还不懂你打我

热门文章

最新文章