1. 程式人生 > >具體解釋java中的volatilekeyword

具體解釋java中的volatilekeyword

內存 告訴 標準 生死 狀態 兩個 同步機制 volatile 輕量


一、為什麽要有volatilekeyword

預計非常多java剛開始學習的人都被volatile這個keyword迷惑過。盡管網上有非常多討論volatile的文章,但它們有的過於講述底層原理,而沒有說明其應用場景,讓剛開始學習的人看後還是一頭霧水;有的過於使用類比解說。造成了一定的錯誤。這種文章更害人。以下,小弟試著分析下volatilekeyword的作用及使用方法。希望能給大家帶來一定的啟示。文中錯誤之處,請各位大神指正。

我們知道,在多線程編程中,多個線程在訪問共享變量時,必須進行必要的同步,否則非常可能產生錯誤。synchronizedkeyword能夠用來提供這樣的同步。該keyword主要將方法或者代碼塊設定為同步的方法或者同步的代碼塊。

這樣的同步能夠提供例如以下兩個保證:

1、原子性。無論這種方法或者代碼塊被多少線程訪問。方法和代碼塊中的語句僅僅能作為一個總體運行,即當一個線程訪問一個同步方法時,僅僅有當方法運行完時,其它線程才幹運行該方法。簡單講,就是一個線程一個線程來,並且必須所有運行完同步方法或代碼塊中的語句。

2、內存可見性。

這指的是一個線程在同步方法或者代碼塊中對共享變量做的不論什麽改變,對隨後的其它線程都是可見的。

這樣的同步機制就像是一套嚴整的西裝,非常標準,但就是穿起來有點別扭,開銷也大。有時用起來不是非常方便,比方,在程序中有一個狀態變量。被多個線程讀取,我們僅僅要求每一個線程讀取到的值都是最新值,並依據最新狀態採取不同的操作。這樣的情況下,java為我們提供了一個輕量級的解決方式,就是使用volatile。

二、volatilekeyword的作用是什麽

volatile的英文意思是“易變的。不穩定的;(液體或油)易揮發的;爆炸性的;快活的。輕快的”。可見,單從字面上理解,volatile應該用在易變、不穩定的變量上。其實,確實如此,這個keyword的作用就是告訴編譯器,凡是被該keyword聲明的變量都是易變的、不穩定的。

所以不要試圖對該變量使用緩存等優化機制,而應當每次都從它的內存地址中去讀取值。

使用volatile標記的變量在讀取或寫入時不須要使用鎖,這將降低產生死鎖的概率,使代碼保持簡潔。

請註意。這裏僅僅是說每次讀取volatile的變量時都要從它的內存地址中讀取。並沒有說每次改動完volatile的變量後都要立馬將它的值寫回內存。也就是說volatile僅僅提供了內存可見性。而沒有提供原子性。

三、什麽時候使用volatilekeyword

知道了volatile的作用,我們也就知道了它應該用在哪些地方。

非常顯然。最好是那種僅僅有一個線程改動變量。多個線程讀取該變量的地方。

也就是對內存可見性要求高,而對原子性要求低的地方。

舉個樣例,我們寫遊戲時。常常須要定義一個遊戲的狀態變量,並在主線程中依據不同條件改動它。為了提高遊戲執行效率,我們通常並發用多個線程處理程序數據。這些線程都要訪問遊戲的狀態變量,才幹依據遊戲狀態進行對應的操作。這個時候用volatile就再合適只是了。


具體解釋java中的volatilekeyword