jclj.net
当前位置:首页 >> volAtilE特性 >>

volAtilE特性

任何被volatile修饰的变量,都不拷贝副本到工作内存,任何修改都及时写在主存.因此对于Valatile修饰的变量的修改,所有线程马上就能看到,但是volatile不能保证对变量的修改是有序的.什么意思呢?假如有这样的代码:Java代码 public

volatile是个类型限定符.声明为volatile的变量表明它具有与优化相关的特殊属性.volatile用于强制某个实现屏蔽可能的优化.例如,对于具有内存映象输入/输出的机器,指向设备寄存器的指针可以声明为指向volatile的指针,目的是防止编译器通过指针删除明显多余的引用.

当我们声明共享变量为volatile后,对这个变量的读/写将会很特别.理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个读/写操作做了同步.下面我们通过具体的示例来说明,请看下面的示例代

在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写.这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的

用volatile关键字定义变量,相当于告诉编译器,这个变量的值会随时发生变化,每次使用时都需要去内存里重新读取它的值,并不要随意针对它作优化.不使用volatile定义的变量,可能因为编译器优化而出现一些问题,具体可以看给出的参考资料,里面有一个例子.建议使用volatile变量的场所:(1) 并行设备的硬件寄存器(2) 一个中断服务子程序中会访问到的非自动变量(全局变量)(3) 多线程应用中被几个任务共享的变量

volatile和synchronized的区别与联系:在Java中,为了保证多线程读写数据时保证数据的一致性,可以采用两种方式:使用volatile关键字:用一句话概括volatile,它能够使变量在值发生改变时能尽快地让其他线程知道.如用synchronized关键字

volatile具有可见性、有序性,不具备原子性.注意,volatile不具备原子性,这是volatile与java中的synchronized、java.util.concurrent.locks.Lock最大的功能差异,这一点在面试中也是非常容易问到的点.下面来分别看下可见性、有序性、原子性

C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier.volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等.遇到

变量放在主存区上,使用该变量的每个线程,都将从主存区拷贝一份到自己的工作区上进行操作.volatile, 声明这个字段易变(可能被多个线程使用),Java内存模型负责各个线程的工作区与主存区的该字段的值保持同步,即一致性.static,

关键字就是已被C语言本身使用,不能作其它用途使用的字.例如关键字不能用作变量名、函数名等由ANSI标准定义的C语言关键字共32个:auto double int struct break else long switchcase enum register typedef char extern return unionconst

网站首页 | 网站地图
All rights reserved Powered by www.jclj.net
copyright ©right 2010-2021。
内容来自网络,如有侵犯请联系客服。zhit325@qq.com