乙個解釋volatile關鍵字作用的最好的例子

2022-03-04 08:22:08 字數 1912 閱讀 5673

閒話少敘,上**

package

com.dwz.concurrency2.chapter3;

public

class

volatiletest

}}, "reader").start();

new thread(() ->

catch

(interruptedexception e)

}}, "updater").start();

}}

測試結果,出現兩種情況:

1.init_value被volatile關鍵字修飾時,reader執行緒是可以感知到updater的變化

update the value to [1]

the value updated to [1]

update the value to [2]

the value updated to [2]

update the value to [3]

the value updated to [3]

update the value to [4]

the value updated to [4]

update the value to [5]

the value updated to [5]

2.init_value缺少volatile關鍵字修飾時,reader執行緒感知不到updater的變化

update the value to [1]

update the value to [2]

update the value to [3]

update the value to [4]

update the value to [5]

volatile可以保證記憶體可見性,有序性,不讓jvm自作主張去優化,可以保證讀之前的寫操作完成,但是不能保證原子性

package

com.dwz.concurrency2.chapter3;

public

class

volatiletest2

catch

(interruptedexception e)

}}, "adder-1").start();

new thread(() ->

catch

(interruptedexception e)

}}, "adder-2").start();

}}

測試結果:adder-1中的init_value 和 adder-2中的init_value會出現重複資料,因此volatile關鍵字是不能保證原子性的

volatile的使用場景

1.狀態量標記

volatile boolean start = true;

while(start)

2.屏障前後的一致性

volatile關鍵字在多執行緒三個特性角度:

一旦乙個共享變數被volatile修飾,具備以下含義:

1.保證了不同執行緒間的可見性

2.禁止對其進行重排序,也就是保證了有序性

3.並未保證原子性

volatile關鍵字實質:

1.保證重排序的時候不會把後面的指令放到屏障的前面,也不會把前面的放到後面

2.強制對快取的修改操作會立刻寫入主存

3.如果是寫操作,它會導致其他cpu中的快取失效

Volatile 關鍵字的簡單解釋

用最簡單語言概括乙個功能點是乙個好的程式設計師應該做的 先閒聊一波 一般用syn鎖,但是這個鎖沉重,粗苯,一鎖基本上別人想都別想呼叫 經典的案例 hashtable 執行緒安全,用的就是sync鎖,put get方法都加了sync關鍵字修飾,導致只要有人呼叫,別人就別想動,只能排隊,排到死,嚴重影響...

volatile關鍵字解析(一)

引起執行緒併發問題,可以簡單的總結為以下三條 原子性問題 什麼是原子性?原子性,即乙個操作或者多個操作,要麼全部執行並且執行過程中不會被任何因素打斷,要麼全部都不執行。如常見的銀行轉賬 count 操作等,都必須具備原子性才能保證不出現意外。a向b轉賬100元,需要保證兩步 a賬戶減100,b賬戶加...

關鍵字 volatile關鍵字的作用

1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...