1.保证内存可见性

通俗来说就是,线程A对一个volatile变量的修改,对于其它线程来说是可见的,即线程每次获取volatile变量的值都是最新的。

当一个变量被 volatile 修饰时,任何线程对它的写操作都会立即刷新到主内存中,并且会强制让缓存了该变量的线程中的数据清空,必须从主内存重新读取最新数据。

   在线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致。
   

  当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。
  当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致。

volatile的本质:

volatile应该解释为“直接存取原始内存地址”比较合适,“易变的”这种解释简直有点误导人。

综上所述,频繁地使用volatile很可能会增加代码尺寸和降低性能,但它却可以保证程序的正确性,所以在合适的地方使用volatile关键字是必要的。

*************************************************************************************

1)使用中断改变对象值的情况

  我们在中断服务程序中操作了某个对象,比如谁改变了一个变量的值。而在其它程序中我们希望通过这个变量值得改变去进行一些操作。在这个时候,我们使用或者不使用volatile关键字,可能得到截然不同的结果。

  如果我们将变量定义为:static int var=0; ,然后再中断服务成勋中将其修改为:var=1,但是在另一函数中使用它但不会修改它,那么编译器会认为它没有变化,从而直接使用寄存器中的副本。

  如果我们将变量定义为:volatile int var=0;,那么结果就完全不同了,每次在函数中使用var变量时,都会重新读取,而不会使用寄存器中的副本。

(2)多任务共享标志的情况

  多任务共享时,其实也是一样的,在一个任务中修改了一个对象后,在另一个对象中应用它,但编译器并没发现在该任务中对它有修改。由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。从而并不能响应在另一任务下的变化。

  在这种情况下,一般我们都需要使用volatile关键字来定义任务间共享的标识。

3)硬件寄存器内存映射的情况

  内存映射的情况是非常多的,比如我们将外设的寄存器映射到内存的某一段区域;再比如我们同过DMA方式将数据直接写到内存中的某一段区域。

由于我们外部的数据都是直接进入了内存区域,而程序知识引用它的值。编译器优化时可能就直接采用寄存器中的副本了。佷显然这不是我们需要的结果,这时将这段内存对应的变量声明为volatile,则可以保证我们的需求。

*************************************************************************************

C语言volatile的本质(三十四)相关推荐

  1. c语言三级上机题库,2006年9月全国等级考试三级c语言上机题库(三十四)

    ★☆题目34(无忧id 73,102 素数题) 无忧id 102 题提供了求素数isPrime()函数 程序prog1.c的功能是:选出100以上1000之内所有个位数字与十位数字之和被10除所得余数 ...

  2. 三十四、深入Java中的泛型(上篇)

    @Author:Runsen @Date:2019年10月22日 19:39:21 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件 ...

  3. [Python人工智能] 三十四.Bert模型 (3)keras-bert库构建Bert模型实现微博情感分析

    从本专栏开始,作者正式研究Python深度学习.神经网络及人工智能相关知识.前一篇文章开启了新的内容--Bert,首先介绍Keras-bert库安装及基础用法及文本分类工作.这篇文章将通过keras- ...

  4. 【零基础学Java】—Calendar类(三十四)

    [零基础学Java]-Calendar类(三十四) java.util.Calendar日历类 Calendar类是一个抽象类,里面提供了很多操作日历字段的方法 Calendar类无法直接创建对象,里 ...

  5. Android 天气APP(三十四)语音搜索

    上一篇:Android 天气APP(三十三)语音播报 语音搜索 前言 正文 一.权限配置 二.用户体验优化 三.配置语音识别听写 四.语音搜索 五.地图天气添加语音搜索功能 六.城市搜索添加语音搜索功 ...

  6. [转载]三十四个有趣的小故事

    [转载]三十四个有趣的小故事 一. 用人之道 去过庙的人都知道,一进庙门,首先是弥陀佛,笑脸迎客,而在他的北面,则是黑口黑脸的韦陀.但相传在很久以前,他们并不在同一个庙里,而是分别掌管不同的庙.弥乐佛 ...

  7. 第三十四章 数论——高斯消元解线性方程组

    第三十四章 数论--高斯消元解线性方程组 一.高斯消元 1.线性方程组 2.高斯消元步骤 (1)数学知识铺垫 增广矩阵和阶梯矩阵 初等变换 (2)高斯消元步骤 二.代码模板 1.问题: 2.代码 一. ...

  8. c语言int型等长输出,c语言先程序设计15第十四讲第六章下.ppt

    c语言先程序设计15第十四讲第六章下 高级语言程序设计 主讲教师:贾彩燕 计算机与信息技术学院 计算机科学与技术系 cyjia@ 第六章 数组 主要内容 数组的概念.定义和使用 数组程序实例 数组作为 ...

  9. 程序员编程艺术第三十四~三十五章:格子取数问题,完美洗牌算法

    第三十四~三十五章:格子取数,完美洗牌算法 作者:July.caopengcs.绿色夹克衫.致谢:西芹_new,陈利人, Peiyush Jain,白石,zinking. 时间:二零一三年八月二十三日 ...

最新文章

  1. DOM对象和JQUERY对象
  2. java类的对象无参与有参_java无参与有参以及setter和getter方法(了解)
  3. python的plt函数_plt.plot画图函数
  4. Ansible 介绍和架构、特性
  5. linux卸载pci驱动,linux的PCI驱动固件问题
  6. html 对话框 flatballoon,CSS纯样式实现箭头、对话框等形状
  7. 如何找到Eclipse左侧项目栏
  8. 分享 2 个“捷径”,帮你 6 个月达到阿里 P7 水平
  9. 设置只能查看一条_苹果手机QQ又一次更新 可分屏查看文件
  10. 20200308: 生成每种字符都是奇数个的字符串灯泡开关 III(leetcode5352-5353)
  11. php7.1 mysql_安装最新LAMP环境 (CentOS7+PHP7.1.5+Mysql5.7)
  12. 纪念一下挖到CSDN官网漏洞
  13. 【原创】STM32低功耗模式及中断唤醒(基于BMI160及RTC)的研究
  14. ATTINY85 和 ATTINY84 与arduino的对应引脚
  15. 数学建模(4):动态规划
  16. 【译】3D打印:介绍
  17. MYSQL (关系型数据库管理系统)的基础知识详解
  18. 学习PPT与Excel的各种高级应用并掌握相关技巧
  19. [分享] Hyper-V 安装Win7激活后黑屏
  20. html使三角形渐变色,CSS3 简单的三角形渐变效果

热门文章

  1. shell命令:echo命令
  2. 如何基于数据快速构建用户模型(Persona)?
  3. 开源人工智能技术将改变一切
  4. JVM性能优化, Part 5:Java的伸缩性
  5. backbone学习笔记:集合(Collection)
  6. tomcat 7 无法打开管理页面
  7. 奇葩属性:layout_weight 的解释及使用
  8. RFID将成为物联网革命的首战
  9. mysql集群会备份数据吗_MySQL 集群备份2-功能分析
  10. QT中如果出现: warning: 'nullptr' is incompatible with C++98等类似警告