volatile

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变量读写的限制,就能保证线程每次读到的都是最新的值,从而确保了该变量的内存可见性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章