您好,登錄后才能下訂單哦!
Java中如何使用volatile關鍵字,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
volatile關鍵字的作用就是使變量在多個線程間可見。
請點
我們看線程進入了循環停止不了了,雖然我們設置isRuning屬性等于false但是循環還是沒有停止,這到底是什么原因呢?要想知道這個問題的產生原因我們就要先了解線程的內存結構。這里我們只是簡單的了解一下,在后面的文章中我們在重點介紹Java中線程的內存模型。
實際上在Java中多線程都有一個自己的內存空間,每個線程的內存空間與其它線程內存空間是不同步的,也就是說不同的線程與線程之間是無法直接交互的。它們是通過主內存來交互的。當多線程執行時,它會先把主內存中的屬性拷貝到自己的線程內存中然后在去執行具體的邏輯操作,當處理完畢后再將處理結果同步到主內存中。如果兩個線程是異步執行的,那它們都會把主內存中的數據拷貝到自己的內存空間中處理,當處理完畢后都會將自己的處理數據同步到主內存中,這也是開發多線程程序有線程安全問題的根本原因。就是在多個線程都將自己線程內存中的數據同步到主內存中產生的問題。
上述代碼出現循環不結束的原因是因為當線程啟動后會將isRuning屬性拷貝到自己的線程內存中,然后執行循環,這時我們雖然設置了isRuning屬性為false,但是這設置的是主內存的屬性值,線程中的isRuning屬性還是true,線程不會在去主內存中取值,所以程序還是會一直執行循環的。
那怎么樣才能解決這個問題呢 ,可能有人會想說用synchronized同步方法,但按照我們上述所分析的,這不是多個線程同時訪問實例變量產生的問題,而是線程內存與主內存不同步的問題,顯然用synchronized是解決不了上述問題的。那么怎么辦呢?
放心在Java中還提供了一個關鍵字來解決類似上述問題所產生的線程安全,它就是volatile關鍵字。這也是我在文章開頭所說的。volatile關鍵字的作用就是使變量在多個線程間可見。看它的說明感覺挺讓人費解的。那我們簡單點說明就是用volatile關鍵字修飾的變量只能保存在主內存中,或者說線程在使用volatile數據時只能去主內存中是取值。也可以理解為每個線程在拷貝主內存數據到自己的線程內存時,volatile關鍵字修飾的變量是拷貝不了的。這也就保證了無論有多少個線程,如果它們需要使用volatile關鍵字修飾的變量,那只能去主內存中是取值。這恰恰是我們想要的,所以上述的代碼我們只需添加一個volatile關鍵字就能解決死循環的問題了。
我們看循環結束了,原因就是像我們剛剛所說的那樣。在實際的開發中volatile關鍵字在多線程中我們經常使用。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。