volatile(java里面volatile是什么意思)

本文目录
- java里面volatile是什么意思
- c语言中volatile关键字是什么含义怎么办呢
- C语言中关键字volatile是什么意思
- volatile这个关键字有什么作用
- 面试必问的volatile,你了解多少
- 关键字volatile有什么含义
- C++中的volatile是什么意思
java里面volatile是什么意思
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。
就跟C中的一样 禁止编译器进行优化~~~~
c语言中volatile关键字是什么含义怎么办呢
volatile
影响编译器编译的结果,指出,volatile
变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(vc++
在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。
例如:
volatile
int
i=10;
int
j
=
i;
...
int
k
=
i;
volatile
告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。
而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错。
C语言中关键字volatile是什么意思
volatile的本意是一般有两种说法。1.“暂态的 2.“易变的。这两种说法都有可行。一个定义为volatile的变量是说这变量可能会被意想不到的改变,这样,编译器就不会去假设这个变量的值了。优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。 www.okeycar.com
volatile这个关键字有什么作用
volatile 关键字表示,编译器进行强制 I/O 寻址,而非读取寄存器的值。
一般情况下,连续使用的变量,编译器会先把数据读出来,并且保存到寄存器里,
使用的时候,直接读取寄存器里的数据,这样处理速度会快一点,
但是,有些时候,比如实时读取按键值,或者其它要求比较实时的数据,
就不能使用寄存器了,必须要用到 volatile 关键字了。
面试必问的volatile,你了解多少
我全部了解,并且可以给你全部讲懂。
volatile关键字的意思是易变的,告诉线程在读取变量的值时,不能使用线程的本地缓存值,必须取最新的。
这个理解起来容易,但关键还是要用的恰当。
有人将其用于变量的并发和原子读写,一测试发现问题来了,好像不怎么管用,无奈之下,不得不结合同步关键字实现。
并发读写的实现其实有两个关节:
一是原子读写。
如,a=5。一定能够确保5被赋值给a。
二是数据一致性。这个看上去好理解,其实有点难。
如,a=a+5,包含两步操作,先是读取a的值,再加上5赋值给a。如果在执行第二步的时候a的值被其他线程改变,那么你的赋值就没有意义,就是脏数据。而这个包含多步操作的一致性正是volatile关键字无法做到的。
所以当你要同步的变量包含条件读写,或者涉及多步操作的同步,就不要用volatile。
而仅包含一步操作的同步就可用volatile了,这个比同步关键字效率高。
例如java线程池实现中的异常处理handler就使用的volatile,因为这handler,在整个线程池类只是被赋值或者执行,不做为其他状态和数据的条件,就是典型的一步同步。
关键字volatile有什么含义
volatile是一个类型修饰符(type specifier),类似const一样,它是被设计用来修饰被不同线程访问和修改的变量。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
C++中的volatile是什么意思
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。 volatile的本意是“易变的”,不过翻译成“直接存取原始内存地址”更为合适。“易变”是因为外在因素引起的,象多线程,中断等,并不是因为用volatile修饰了的变量就是“易变”了,假如没有外因,即使用volatile定义,它也不会变化。 volatile 指出 i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的汇编代码会重新从i的地址读取数据放在b中。而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在b中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问。 一般说来,volatile用在如下的几个地方: 中断服务程序中修改的供其它程序检测的变量需要加volatile; 多任务环境下各任务间共享的标志应该加volatile; 存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义。 另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。

更多文章:
majority of(the majority of 和 a majority of的区别以及用法例句)
2026年10月11日 07:40
another time(another time和other time的区别)
2026年10月11日 05:00






