1.volition关键字的作用
volatile是“易变的”的意思,当使用volatile修饰一个变量时,即表示这个变量的值随时都有可能发生改变,因此编译器在编译的时候对该变量的存取操作不能进行优化,即告诉编译器每次存该变量的时候都要从内存中去存取而不是使用其在之前寄存器中的变量。
首先解释一下:什么是读变量,什么是写变量。
(1)读变量:内存->寄存器;
(2)写变量:寄存器(cpu)->内存。
int a,b; //为a和b申请内存;
a=1; //1->寄存器 寄存器->内存
b=a; //内存(&a)->寄存器 寄存器->内存(&b)
volatile修饰变量后:
volatile int a=1,b,c; //为a,b,c申请空间,并为a初始化;
b=a //内存(&a)->寄存器 寄存器->内存(&b)
c=a //内存(&a)->寄存器 寄存器->内存(&c)
注意:当不使用volatile关键字修饰变量a时,在对c=a这一步赋值时,编译器对可能会进行优化,直接从寄存器中取值,省略了内存到寄存器这一步。而使用了volatile关键字后,编译器不会进行优化,直接从内存中进行取值。
2.volatile应用场合
(1)中断:中断服务程序中若修改其他程序中使用的变量,需使用volatile关键字;
(2)多线程:多个线程都要访问的变量一般需要加volatile修饰;
(3)硬件寄存器:硬件寄存器的值可能会随着硬件工作状态的变化而发生改变。
3.volatile三大特性:
(1)易变性:在汇编层面反应出来,就是两条,下一条语句不会直接使用上一条语句对应的volatile变量的寄存器内容,而是重新从内存中读取;
(2)不可优化性:volatile告诉编译器,不要对我这个变量进行各种激进的优化,甚至将变量直接消除,保证程序员写在代码中的指令,一定会被执行;
(3)顺序性:能够保证volatile变量之间的顺序性,编译器不会进行优化。