Java內存模型Jmm與volatile可見性

1.volatile

能夠保證線程的可見性,當一個線程在修改我們主內存中的共享變量的數據時候,能夠對另外一個線程可見。
注意: volatile 關鍵字是不能夠保證原子性。
特性:保證可見性、防止重排序、不能保證原子性。”

2.如何停止線程

1代碼

在這裏插入圖片描述
結果:
1s後沒有停止,因爲 FLAG不可見
在這裏插入圖片描述
改進:
增加volatile
在這裏插入圖片描述

3.多線程不可見

因爲我們Cpu直接操作我們主內存數據的時候( 共享的全局變量,)整個效率是非常低,所以在這時候就產生了三級緩存。
L11213
相當手在每個cpu中都有自己獨立高速緩存,在高速緩存中主要存放主內存中共享變量中的副本數據。
注意:每個cpu中副本數據相互之間是可見的,而且是相互不影響。

Cpu在這個時候直接訪問我們副本數據,肯定比訪問主內存數據效率要高。
在這裏插入圖片描述
在這裏插入圖片描述

4.什麼主內存

主內存中實際存放就是我們共享變量的數據_堆大方法區
在這裏插入圖片描述

5.什麼工作內存

指的其實就是我們主內存共享變量數據的副本。

程獨佔狀態
(2) unlock(解鎖): 作用於主內存的變量,把一一個處於鎖定狀態的變量釋放出來,釋放後的變量纔可以被其他線程鎖定
(3) read(讀取): 作用於主內存的變量,把一個變量值從主內存傳輸到線程的工作內存中,以便隨後的load動作使用
(4) load(載入): 作用於工作內存的變量,它把read操作主內存中得到的變量值入工作內存的變量副本
(5) use(使用):作用於工作內存的變量,把工作內存中的一一個變量值傳遞給執行引擎
(6) assign(賦值):作用於工作內存的變量,它把一一 個從執行引擎接收到的值賦給.工作內存的變量
(7) store(存儲): 作用於工作內存的變量,把工作內存中的一個變量的值傳送到主內存中,以便隨後的write的操作
(8) write(寫入):作用於。工作內存的變量,它把store 操作從工作內存中的-一個變量的值傳送主內存的變量
在這裏插入圖片描述
 v

MESI協議

1.M修改(Modified)這行數據有效,數據被修改了,和主內存中的數據不- -致,數據
在於本Cache中。
2.E獨享、互斥(Exclusive)這行數據有效,數據和主內存中的數據一致,數據只存在
Cache中。
3.S共享(Shared)這行數據有效,數據和主內存中的數據一-致, 數據存在於很多Cach
4.I無效(Invalid) 這行數據無效。

E:獨享:當只有一個cpu線程的情況下,cpu副本數據與主內存數據如果
保持一致的情況 下,則該cpu狀態爲E狀態獨享。
S:共享:在多個cpu線程的情況了下,每個cpu副本之間數據如果保持一致
的情況下,則當前cpu狀態爲S
M:如果當前cpu副本數據如果與主內存中的數據不一致的情況下,則當前cpu狀態
爲M
I:總線嗅探機制變爲無效多個cpu之間副本數據不一致性

總線:

維護解決cpu高速緩存副本數據之間-一致性問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章