java 内存模型:
主内存:保存对象实例数据、数组等--对所有线程共享。
工作内存(缓存): 线程私有,线程执行时,从主内存获取变量副本,保存在工作内存,对其进行操作,操作完成之后再写入工作内存。
1.保证可见性
每条线程执行时都有有自己的工作内存,当对一个变量操作时,会从主内存中取出变量存入线程的工作内存,之后对该变量的读操作一直在线程工作内存中,工作内存中的变量发生变化时会写入主内存,但主内存的变量发生变化(可能由其它线程写入)时不一定及时的同步至工作内存中,这样就造成线程读取的变量还是以前的值。
变量声明为 volatile:
读时:每次都从主内存中读取最新的变量值到工作内存,再进行操作。
写时:每次写操作都把变量值及时同步到主内存中,以使其它线程及时可见。
2.原子性
volatile 声明的变量本身具有原子性。64位的变量 double,long 如果不声明为volatile,其写入的值可能出错。可能A线程写入高32位,暂停,B线程写入高32位和低32位,A线程继续写入低32位,最终结果是B线程的高32位+A线程的低32位。
另一种方式使用同步锁,但开销有点大。
3.编译代码不重新排序
在某种情况下编译器进行优化代码,进行代码重排序(改变代码执行的先后顺序),如果这种重排序会影响代码正确性,则需要将变量生明为volatile,编译器不会对它进行重排序操作。
相关推荐
详细说明 并举例说明了VOlatile的作用及用法,特别是嵌入式程序员要注意的
一般对于volatile的解释是这样的:将变量定义为volatile可以防止编译器对变量进行优化,每次均从内存中访问变量,而不是寄存器。既然让编译器优化可以提高访问速度,那为什么又要不用它以及什么时候不用它?其实主要...
C语言中关键字volatile的作用,使用说明和例子
const,extern,static,volatile的使用
一般说来,volatile用在如下的几个地方: 1、中断服务程序中修改的供其它程序检测的变量需要加volatile; 2、多任务环境下各任务间共享的标志应该加volatile; 3、存储器映射的硬件寄存器通常也要加volatile说明,...
const和volatile分析 这个分析得很好 面试 找工作 必备的
volatile的用法讲解,讲得很详细,希望能帮助到大家
主要讲述java线程volatile关键字
C程序中volatile关键字的使用.方法及其例程介绍。
volatile与synchronized的区别,锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)
本文给大家介绍了单片机C语言中volatile的作用。
讲述了volatile_unsigned_int地址映射的使用说明。
宏定义volatile的用法,希望和大家共同学习进步。
Java并发编程:volatile关键字解析
volatile变量的使用是区分c程序员和嵌入式系统程序员的最基本问题。不懂得volatile变量的内容将带来灾难。这个文档帮助你减少因此带来的bug。
static,const,volatile用法的解析,对三项中全局变量和局部变量的区分,volatile中介绍了其具体用法 和一些区别,bong有例子
extern_volatile等修饰符的用法
volatile 的字面含义是易变的,那么将一个变量指示为volatile 是什么意思呢?是告诉编 译器这个变量是易变的?事实上也是如此。在多任务、中断等环境下,变量可能被其他的任 务改变,而编译器无法发现,volatile ...
本文将深入分析在硬件层面上Inter处理器是如何实现Volatile的,通过深入分析能帮助我们正确的使用Volatile变量。
本篇文章主要介绍单片机中volatile定义的作用,感兴趣的朋友可以看看。