volatile 意思是 易变的,用来修饰某个变量,如 volatile int flag = 0; 告诉编译器这是一个容易被改变的量,每次用的都要到源内存地址去读取,请不要随便优化,不要读缓存,避免优化后读取到的值不是实时的准确值。
如 int flag = 0;int a = flag, int b = flag; 在对a和b赋值的过程中,编译器从这段代码看到并没有对flag重新赋值的地方,所以会用赋值给a的flag直接赋值给b,但是多线程情况下,flag可能在其他线程被修改了,所以赋值给b的时候可能是一个不准确的值。还有就是flag如果是通过中断函数修改,或者通过汇编代码修改了,从编译器角度也看不出来,所以编译器的优化会导致拿到不准确的值。
编译为什么会做这个优化呢?因为从编译器的角度就是要想办法让程序运行时能提高性能,对读取过的值放到寄存器或者高速缓存上下次再去读,相对于每次都去内存中读,效率就会提升很多。可以对比这两句代码执行的时间看出有volatile和没有volatile的效果。
for(int i=0; i<1000000000; i++);// 编译器优化
for(volatile int i=0; i<1000000000; i++);// 编译器不优化