`

对volatile的简明解释

阅读更多
http://blog.21ic.com/user1/5473/archives/2009/54693.html
volatile 关键字表示字段可能被多个并发执行线程修改。声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该字段在任何时间呈现的都是最新的值。

其实Volatile是由于编译器优化所造成的一个Bug而引入的关键字。
int a = 10;
int b = a;
int c = a;
理论上来讲每次使用a的时候都应该从a的地址来读取变量值,但是这存在一个效率问题,就是每次使用a都要去内存中取变量值,然后再通过系统总线传到CPU 处理,这样开销会很大。所以那些编译器优化者故作聪明,把a读进CPU的cache里,像上面的代码,假如a在赋值期间没有被改变,就直接从CPU的 cache里取a的副本来进行赋值。但是bug也显而易见,当a在赋给b之后,可能a已经被另一个线程改变而重新写回了内存,但这个线程并不知道,依旧按照原来的计划从CPU的cache里读a的副本进来赋值给c,结果不幸发生了。
于是编译器的开发者为了补救这一bug,提供了一个Volatile让开发人员为他们的过失埋单,或者说提供给开发人员了一个选择效率的权利。当变量加上了Volatile时,编译器就老老实实的每次都从内存中读取这个变量值,否则就还按照优化的方案从cache里读。
分享到:
评论

相关推荐

    简明教程 一周学会C#

    【一周学会C#简明教程】是一篇旨在帮助初学者快速掌握C#编程语言的教程。C#由微软在21世纪初推出,它结合了其他编程语言的优点,并且是.NET框架的重要组成部分。本教程分为六个部分,逐步引导读者理解和应用C#。 ...

    C语言深度剖析简明教程

    书中首先列出了C语言的32个关键字,并对其含义进行了详细的解释。 - **auto**: 表示自动存储类型的变量,缺省时通常被编译器认为是自动类型。 - **int**: 用于声明整型变量。 - **double**: 声明双精度浮点型变量。...

    Java并发基础共6页.pdf.zip

    本资料“Java并发基础共6页.pdf.zip”很可能包含了一份简明扼要的教程,涵盖了Java并发编程的基础知识。尽管文件名称暗示内容可能不多,但我们可以深入探讨这个主题,以便更好地理解Java并发编程的关键点。 首先,...

    FreeRTOS操作系统入门(一)——任务调度.pdf

    FreeRTOS是一个专为微控制器设计的实时操作系统(RTOS),它包括任务调度、同步、信号量、消息...文档通过简明的实例和解释,使得初学者能够快速掌握FreeRTOS任务调度的核心内容,为后续学习更高级特性打下坚实的基础。

    java编程规范大全

    - 类、接口和方法上方应有简明扼要的Javadoc注释,解释其功能和使用方式。 - 长方法内可以添加行内注释,解释复杂逻辑或特殊情况。 - 避免无意义的注释,注释应与代码保持同步更新。 3. **代码结构** - 使用...

    alibaba Java 开发规范

    - 类和接口的注释应简明扼要地解释其作用和用途。 - 方法的注释需说明参数、返回值、异常和使用注意事项。 - 变量的注释要明确其存储的数据意义。 3. 代码风格: - 避免使用魔法数字,即直接在代码中使用的未...

    Java语言编程规范--华为技术有限公司

    - 行内注释简明扼要,避免过多的代码解释,注释应紧跟在被注释代码之上。 - 文件头部包含版权信息、作者、创建日期及修改历史等。 3. **代码结构**: - 每个类应有明确的职责,遵循单一职责原则(SRP)。 - ...

    Programming.iOS.5.2nd.Edition.pdf

    本章为读者提供了一个C语言的简明教程,旨在帮助那些没有C背景的开发者快速上手,以便更好地学习Objective-C。 - **编译、语句与注释**:讲解了C语言的基本语法结构,包括如何编写简单的程序,如何添加注释以及程序...

    Java编码规范

    这份名为“Java编码规范精简版本”的文档,可能是针对Java程序员的一份简明指南,旨在提供核心的编程准则和最佳实践。 在Java编程中,编码规范涵盖了多个方面,包括但不限于以下几个关键点: 1. **命名规范**:...

Global site tag (gtag.js) - Google Analytics