java中volatile關(guān)鍵字到底是干什么的?
volatile關(guān)鍵字到底是干什么的?(新手可略過(guò))
馬克- to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號(hào): 73203。
我們先簡(jiǎn)要了解一下java虛擬機(jī)的內(nèi)存模型。就像數(shù)據(jù)從物理內(nèi)存拷貝到cpu高速緩存,進(jìn)行操作完,再把數(shù)據(jù)返回到內(nèi)存一樣,為了屏蔽CPU高速緩存和內(nèi)存復(fù)雜細(xì)節(jié)且贏得跨平臺(tái)的效果,java把所有的變量都存在主存(相當(dāng)于物理內(nèi)存)當(dāng)中,每個(gè)線程都有自己的工作內(nèi)存(相當(dāng)于CPU高速緩存)。線程在自己的工作內(nèi)存做操作,不能直接對(duì)主存進(jìn)行操作,最后把結(jié)果返回到主存。如果一個(gè)變量有volatile(易變的意思)修飾詞,這意味著當(dāng)有一個(gè)線程修改了這個(gè)變量,系統(tǒng)會(huì)把工作內(nèi)存當(dāng)中的變化強(qiáng)制立刻反應(yīng)在主存當(dāng)中。其他線程要想讀這個(gè)變量,也會(huì)被強(qiáng)迫讀變化了的新值。volatile其實(shí)就保證了此變量無(wú)論怎么變,任何線程看都是最新的。當(dāng)兩個(gè)線程,根據(jù)一個(gè)共同的信號(hào),做互動(dòng)時(shí),一定要加volatile,保證這個(gè)信號(hào)是最新的。
volatile,有人說(shuō)能夠控制程序的語(yǔ)句有序性,但jvm并不能保證在所有的平臺(tái)上都能夠做到這一點(diǎn),所以我的書(shū)中就不贅述了。既然volatile控制程序語(yǔ)句的有序性不能保證所有的平臺(tái)都正確運(yùn)行,基于它的技術(shù)“雙重檢查鎖”創(chuàng)建單態(tài)對(duì)象也就變得不可靠了,本書(shū)也就不覆蓋了。