Volatile底層原理剖析

2021-10-05 03:11:47 字數 1827 閱讀 4966

基礎知識回顧

還是那句話,無論語言再怎麼牛,其都是對底層計算機指令的封裝。

計算機cpu執行指令的時候是非常快的,如果每執行乙個指令都從記憶體中取資料的話,那會非常慢,嚴重影響cpu的執行速度,所以每個cpu都有自身對應的高速緩衝區(多級暫存器),每個執行緒被執行的時候,會先把執行時需要的資料複製到告訴緩衝區乙份,此快取記憶體區只與在該cpu執行的執行緒有關,然後在當前執行緒需要cpu執行n多指令的時候,就不用再去記憶體中拿資料,直接從本地的緩衝區,進而提高cpu的執行任務速度,等待執行完畢後再把結果寫入到主記憶體中,但是什麼時候執行結果會被重新整理至主記憶體中是不太確定的(但是肯定在執行下一指令之前,哈哈);在遇到執行緒放棄執行許可權或者sleep一段時間後等再次被處理器執行的時候,會重新把需要的資料載入高速緩衝區中。

上面這個結構,對於單cpu來說沒有任何問題,但是近代計算機一般都是多個cpu,這樣一來,每個cpu的高速緩衝區如果同時快取了共享變數的話,那麼就有可能出現資料狀態不一致的情況,那麼這個情況怎麼解決呢?兩個解決方案:

匯流排鎖:採用一種類似於獨佔記憶體的方式,同一時間只能有乙個cpu執行,其餘的則被阻塞。

快取一致性協議:當cpu更改資料的時候,如果發現是共享變數就會通知其他cpu此變數的快取行是無效的,這樣其他cpu在使用該變數的時候,就會從記憶體重新讀取資料。

術語釋義

共享變數

可以被多個執行緒同時訪問的變數

記憶體屏障

一組處理器指令,用於對記憶體操作的(指令)順序限制

緩衝行快取中可以分配的最小儲存單位

快取一致性協議也稱mesi協議:

它們之間的關係如下:

volatile的實現原理

jvm的記憶體屏障其實也是對計算機記憶體屏障的封裝,其相容了不容平台的差異,通過呼叫硬體的記憶體屏障指令來實現禁止指令重排。

分類說明

storestore

禁止上面的普通寫和下面的volatile寫重排序

storeload

防止上面的volatile寫與下面可能有的volatile讀/寫重排序

loadload

禁止下面所有的普通讀操作和上面的volatile讀重排序

loadstore

禁止下面所有的普通寫操作和上面的volatile讀重排序

在每個volatile寫操作的前面插入乙個storestore屏障。

在每個volatile寫操作的後面插入乙個storeload屏障。

在每個volatile讀操作的後面插入乙個loadload屏障。

在每個volatile讀操作的後面插入乙個loadstore屏障。

jmm記憶體模型驗證

private

static

boolean exit =

false

;public

static

void

main

(string[

] args)

throws interruptedexception catch (interruptedexception e) {}

} system.out.

println

("over...");

}).start()

; thread.

currentthread()

.sleep

(2000);

exit =

true

;}

執行上面這段程式,你會發現程式會一直執行,但是將exit變數宣告為volatile的時候,2s就停止了。

但是你把try**塊注釋開啟的話,那麼你會發現雖然exit變數不是volatile的,但是程式也會在2停止,為什麼呢?猜測原因有二:

HashMap底層原理簡單剖析

1 hashmap的儲存結構 陣列 鍊錶 紅黑樹 jdk1.8 如下圖所示 2 hashmap的特點,如何實現 我們知道hashmap是一種可以快速儲存很快速查詢的鍵值容器,那麼jdk是如何實現hashmap的快速儲存和快速查詢呢?我們先從陣列和鍊錶以及二叉查詢樹這三種資料結構說起 1 陣列 陣列結...

深度剖析Spring Cloud底層原理

毫無疑問,spring cloud 是目前微服務架構領域的翹楚,無數的書籍部落格都在講解這個技術。不過大多數講解還停留在對 spring cloud 功能使用的層面,其底層的很多原理,很多人可能並不知曉。實際上,spring cloud 是乙個全家桶式的技術棧,它包含了很多元件。本文先從最核心的幾個...

併發程式設計 volatile底層實現原理

解決可見性使用快取一致性。防止指令重排序使用記憶體屏障,保證有序性。有volatile變數修飾的共享變數,編譯時會有lock字首。lock字首指令會引起處理器快取回寫到記憶體。匯流排鎖 快取鎖 乙個處理器的快取回寫到記憶體會導致其他處理器的快取無效。mesi 嗅探 處理器上有一套完整的協議,來保證 ...