閒話少敘,上**
packagecom.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自作主張去優化,可以保證讀之前的寫操作完成,但是不能保證原子性
packagecom.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中的值賦值...