1. 程式人生 > >volatile離我們很近,很親切,不該陌生

volatile離我們很近,很親切,不該陌生

synchronized程式碼塊兒裡面的變數都實現了記憶體可見性。記憶體可見性的底層是CPU的指令實現的。volatile修飾的是變數,它的作用也是實現記憶體可見性,底層用的用的同一個CPU指令。可以這樣理解:synchronized裡面的變數都是volatile修飾的。

 

我們都用過synchronized,但是用viotile機會很少,其實換個角度想想,synchronized裡面的變數完全可以看做被volatile修飾,這樣一想,是不是感覺volatile離我們很近,很親切,不陌生了。

文章下面的提問來源於群裡的成員:volatile除了保證記憶體可見性,還有個作用是防止指令重排。關於這一點,我想做一個說明和補充。

這個成員提出:jvm會對new物件的過程進行指令重排,先分配空間,再把空間地址返回給變數,最後才進行物件例項化,加了volatile後會強制先進行例項化,最後才把物件地址返回被變數。

我覺得:指令重排是不是最終的思想來源還是記憶體可見性呢?如果兩個互不相關的思想,用到一個事物上,感覺怪怪的。我後來想了想:暫存器和主存的隔離造成了資料的不一致,volatile的初衷是保證資料的強一致性,當賦值基本簡單型別的時候,這種一致性很容易實現。但是賦值物件型別的時候,這種一致性分為強一致性和弱一致性,重排是弱一致性,而有序則是強一致性,volatile的目的是強一致性,所以最終它要求指令不得重排。現在我感覺可以把可見性和有序性都統一到一致性上面了。

轉載地址:http://swiftlet.net/archives/3022