jvm如何解決快取一致性問題
1、為何演進,如何演進。
計算機在執行程式的時,每條指令都是在cpu中執行,在執行的過程中勢必會涉及到資料的讀寫。
而程式執行的資料是儲存在主記憶體中的,也就是我們常說的記憶體,那麼此時就會有乙個問題:
解決辦法:
這樣cpu不必與執行速度較慢的主記憶體打交道,而是和執行速度快的cpu快取記憶體打交道,這樣充分利用了cpu的高效效能。
2、演進後導致了什麼問題,如何解決的
硬體的演進使用了cpu快取記憶體,這在單執行緒中的確是沒問題的,但在多執行緒中便會導致快取一致性的問題。
如i++;這段**:
此時有兩個執行緒都這樣操作,那預期i的值應該是3。
兩個執行緒併發操作,會導致如下結果:
3、如何解決
加鎖的方式通過獨佔來實現,只有乙個cpu能執行,效率極為低下,不推薦使用。所以一般會採用快取一致性協議來實現,【窺探技術+mesi協議】。
窺探技術:
mesi協議:
因jvm是硬體層次之上的,所以需要解決快取一致性問題。
1、如何解決:通過volatile關鍵字。
2、volatile記憶體語意含義
volatile可以保證執行緒可見性且提供了一定的有序性,但是無法保證原子性。
在jvm底層volatile是採用記憶體屏障來實現的。
上面那段話,有兩層語義
3、volatile原理
jvm底層是通過乙個叫做記憶體屏障的東西來完成。
記憶體屏障,也叫做記憶體柵欄,是一組處理器指令,用於實現對記憶體操作的順序限制。
下面是完成上述規要求的一些規則,在no的地方就是需要用記憶體屏障來控制的。
也就是第乙個操作以volatile讀開始的都要經過記憶體屏障,第二個操作是volatile寫的時候都要經過記憶體屏障;第乙個是volatile寫, 第二個是volatile讀也需要經過記憶體屏障。
讀:load,寫:store;再配合上圖就很好記了。
併發程式設計學習筆記
併發程式設計第2章,基礎篇 2.1執行緒安全 1併發程式設計即是要控制對共享的可變的變數的訪問操作順序 2保證同步的方法,在語法 級別來說,可以使用synchronized,volatile,或者是現式的鎖,或者使用原子變數 3好的設計是避免執行緒危險的良方,使用oo的方法盡量避免執行緒的隱患。4執...
Java併發學習筆記(1) 併發程式設計基礎
執行緒的狀態 new 初始狀態,執行緒被new 出來,但還沒start 的狀態 runnable 指的是呼叫了start 方法,但還在等著cpu資源的狀態 running 乙個執行緒獲得了cpu資源,正在走的狀態 terminated 執行緒物件的run 方法走完了的狀態 blocked 執行緒被阻...
爪哇學習筆記 併發程式設計3
atom 不可分割 syn基於阻塞的鎖的機制,1 被阻塞的執行緒優先順序很高,2 拿到鎖的執行緒一直不釋放鎖怎麼辦?3 大量的競爭,消耗cpu,同時帶來死鎖或者其他安全。cas的原理 cas compare and swap 指令級別保證這是乙個原子操作 迴圈 死迴圈,自旋 裡不斷的進行cas操作 ...