volatile关键字提醒编译器:
1.a可能随时被意外修改,所以一旦添加了volatile,编译器就不敢优化了。
意外的意思是虽然当前这段代码里看起来a不会变,但可能别的地方正在修改a的值,所谓"别的地方",某些情况下指的就是其他线程了。
//.......... int a=0; //做一些和a无关的事 doSomething(); //if被去掉了 //.......... 但,一旦添加了volatile,编译器就不敢优化了.例如://.......... volatile int a=0; //做一些和a无关的事 if(a==0) doSomething(); //可不敢优化这里! 谁知道a变成多少了! //..........
2.当读取一个被volatile修饰的变量时,会直接从共享内存中读,而非线程专属的存储空间中读。
为什么volatile能保证共享变量的内存可见性?
volatile修饰了一个成员变量后,这个变量的读写就会比普通变量多一些步骤。volatile变量写 当被volatile修饰的变量进行写操作时,这个变量将会被直接写入共享内存,而非线程的专属存储空间。volatile变量读 当读取一个被volatile修饰的变量时,会直接从共享内存中读,而非线程专属的存储空间中读。通过对volatile变量读写的限制,就能保证线程每次读到的都是最新的值,从而确保了该变量的内存可见性。