深入理解volatile關鍵字

2021-10-02 19:41:48 字數 2795 閱讀 4377

併發的三大性質

併發分析的切入點分為兩個核心,三大性質

public

class

volatiledemo})

; thread.

start()

;try

catch

(interruptedexception e)

isover =

true;}

}

volatile修飾的共享變數進行寫操作時,會多出lock字首的指令,實現快取一致性協議

執行緒將修改的變數立刻寫回到主記憶體,導致其他執行緒的本地快取失效

當執行緒發現本地快取失效後,就會從記憶體重新讀取該變數

public

class

volatileexample

public

void

reader()

}}

首先執行緒a寫工作記憶體,然後將變數寫回主記憶體

執行緒b發現工作記憶體的變數失效了,然後重新讀取記憶體

從橫向來看,執行緒a和執行緒b之間進行了一次通訊

如果想阻止重排序要怎麼辦了?答案是可以新增記憶體屏障

編譯器在生成位元組碼時,會在指令序列中插入記憶體屏障來禁止特定型別的處理器重排序

storestore屏障:禁止上面的普通寫和下面的volatile寫重排序;

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

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

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

這樣在main執行緒中將isover改為了true後,thread的工作記憶體該變數值就會失效,從而需要再次從主記憶體中讀取該值,現在能夠讀出isover最新值為true從而能夠結束在thread裡的死迴圈,從而能夠順利停止掉thread執行緒

public

class

volatiledemo})

; thread.

start()

;try

catch

(interruptedexception e)

isover =

true;}

}

首先做總結:synchronized: 具有原子性,有序性和可見性; volatile:具有有序性和可見性

表示乙個操作是不可中斷的,要麼全部執行成功,要麼全部執行失敗

jmm定義了八種原子操作:

1.

lock

(鎖定):作用於主記憶體中的變數,它把乙個變數標識為乙個執行緒獨佔的狀態;

2.unlock

(解鎖)

:作用於主記憶體中的變數,它把乙個處於鎖定狀態的變數釋放出來,釋放後的變數才可以被其他執行緒鎖定

3. read(讀取):作用於主記憶體的變數,它把乙個變數的值從主記憶體傳輸到執行緒的工作記憶體中,以便後面的load動作使用;

4. load(載入):作用於工作記憶體中的變數,它把read操作從主記憶體中得到的變數值放入工作記憶體中的變數副本

store(儲存):作用於工作記憶體的變數,它把工作記憶體中乙個變數的值傳送給主記憶體中以便隨後的write操作使用;

write(操作):作用於主記憶體的變數,它把store操作從工作記憶體中得到的變數的值放入主記憶體的變數中。

5.  use(使用):作用於工作記憶體中的變數,它把工作記憶體中乙個變數的值傳遞給執行引擎,每當虛擬機器遇到乙個需要使用到變數的值的位元組碼指令時將會執行這個操作;
2-8條滿足基本資料型別的訪問讀寫具備原子性

1-2對程式設計師未開放,對應monitorenter,monitorexit指令,對應synchronized關鍵字

public

class

volatileexample})

; thread.

start()

;}trycatch

(interruptedexception e)

system.out.

println

(counter);}

}

表示執行緒順序執行,乙個很好的例子就是 單例模式的雙重效驗鎖方式,給單例物件加了volatile關鍵字,來保證建立物件的有序性,從而保證單例的正常生成,否則若發生指令重排序,會導致建立多個例項物件

建立物件過程:1. 分配物件記憶體 2. 初始化物件 3. 設定instance指向物件

public

class

singleton

private

volatile

static singleton instance;

public singleton getinstance()

}}return instance;

}}

當乙個執行緒修改了共享變數,另乙個執行緒重新讀取此共享變數的值。是通過在指令中新增lock指令來實現

深入理解Java Volatile關鍵字

1.volatile關鍵字的作用是什麼?a.當乙個變數被定義為volatile之後,它將具備兩種特性 一 保證此變數對所有執行緒的可見性 可見性的意思為 當某個執行緒對volatile變數的值進行了修改,其他的執行緒是可以立即得知的 而普通的變數是無法做到這一點的,執行緒先是對工作記憶體當中的普通變...

深入理解關鍵字 const static

對於const關鍵字,我們習慣性的將它直接看作常量,但當你編譯下面 時,會發現與我們之前的理解有所偏差 const int size int arr size c 不能通過 cpp 順利執行 在定義陣列時,必須指定陣列元素個數為常量,但在c中卻不能通過,以此可以推翻const修飾的值是常量。參考 c...

Volatile關鍵字理解

物理角度 由於計算機的儲存裝置和cpu的運算速度有幾個數量級的差距,所以現代計算機系統加入一層速度接近 cpu的快取記憶體 cache 但cache帶來乙個問題 快取一致性問題 在多處理器系統中,每個處理器機油自己的cache 工作記憶體 又共享同一主記憶體。舉例 當程式在執行過程中,會將運算需要的...