關於緩存行的概念估計不少人都據說過,本章就講下關於java的volatile關鍵字與緩存行。
java
CPU 爲了更快的執行代碼。因而當從內存中讀取數據時,並非只讀本身想要的部分。而是讀取足夠的字節來填入高速緩存行。根據不一樣的 CPU ,高速緩存行大小不一樣。如 X86 是 32BYTES ,而 ALPHA 是 64BYTES 。而且始終在第 32 個字節或第 64 個字節處對齊。這樣,當 CPU 訪問相鄰的數據時,就沒必要每次都從內存中讀取,提升了速度。 由於訪問內存要比訪問高速緩存用的時間多得多。緩存
能夠看出來,CPU都是很機智的,每次讀取不止把本次須要的數據讀取進緩存,還會把相鄰的數據也讀進來,可是這樣就有一個問題了,如今的CPU都是多核的,若是有一個數據同時被多個核心緩存,其中一個核心修改了這個數據的值,其餘核心的緩存值就失效了,這時程序就出錯了。微信
那麼,如何應對這種狀況呢?java中,能夠給字段加上volatile關鍵字,使用volatile關鍵字的字段在值被改變後會強制令其餘CPU的緩存失效,也就是說一個CPU在另一個CPU改變了volatile修飾的數據後這個CPU會從新從內存讀取而不會從緩存讀取該數據,保證讀取到的是新數據而不是失效數據。性能
能夠看出,volatile解決了一個CPU更改數據後另一個CPU不知道的問題,可是,若是使用不當,volatile是會下降程序效率的,下節將分析一個volatile致使的性能問題。.net
若是以爲文章不錯請長按下方二維碼關注公衆號,感謝您的支持~內存
本文分享自微信公衆號 - java初學者(JoeKerouac_public)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。get