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變量讀寫的限制,就能保證線程每次讀到的都是最新的值,從而確保了該變量的內存可見性。

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