rjps.net
当前位置:首页 >> volAtilE >>

volAtilE

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份.下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) (中断嵌套)3). 多线程应用中被几个任务共享的变量

volatile的本意是“易变的”,volatile定义的变量它的值在编译时是会改变的,跟const相反,而const定义的变量一直不会变的,如果变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行).

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

我就用上面的例子吧 volatile int i = 10; int k = i; 这段代码如果没有加上volatile,它的执行过程是 i = 10, 10 ->reg寄存器,k = reg值,就是说,k=i实际上是从寄存器里读出来的.这样快捷高效,当然并不是每次都这样,因为寄存器有限.如果在10->reg寄存器的时候,i存储的内存变化了,也就是别的线程修改了i的值,k=i仍然会按照i=10来执行 加上volatile后,执行过程是 i = 10, k = *(int *)(&i); 它会从i的内存地址上去读,当然值会非常准确,但是效率会比从寄存器中读要慢很多.

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

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

volatile是易变的,不稳定的意思,volatile是关键字,是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其他线程等,遇到这个关键字声明的变量,编译器对访问该变量的代码不在进行优化,从而可以提供对特殊地址的稳定访问.volatile 关键字告诉编译器该变量是随时可能发生变化的,每次使用它的时候必须从内存中取出他的值,因而编译器生成的汇编代码会从原内存地址中读取数据使用. 如果一个寄存器或者变量表示一个端口或者多个线程的共享数据,就容易出错,所以volatile可以保证对特殊地址的稳定访问.

Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存.这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值. Java语言规范

volatile 是把变量标识为“变化中的”.意思是这个变量即使在(主线程)没有任何存取操作的情况下也可能在(被其他线程)变化.写上提醒注意线程安全.java 1.4及之前版本加了这个的变量也没有同步安全.java 5以后加了volatile后会在读取方面有同步安全.

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