首先需要理解執行緒安全的兩個方面:執行控制和記憶體可見。
執行控制的目的是控制**執行(順序)及是否可以併發執行。
記憶體可見控制的是執行緒執行結果在記憶體中對其它執行緒的可見性。根據j**a記憶體模型的實現,執行緒在具體執行時,會先拷貝主存資料到執行緒本地(cpu快取),操作完成後再把結果從執行緒本地刷到主存。
volatile
關鍵字解決的是記憶體可見性的問題,會使得所有對volatile
變數的讀寫都會直接刷到主存,即保證了變數的可見性。這樣就能滿足一些對變數可見性有要求而對讀取順序沒有要求的需求。
使用volatile
關鍵字僅能實現對原始變數(如boolen、 short 、int 、long等)操作的原子性,但需要特別注意,volatile
不能保證復合操作的原子性,即使只是i++
,實際上也是由多個原子操作組成:read i; inc; write i
,假如多個執行緒同時執行i++
,volatile
只能保證他們操作的i
是同一塊記憶體,但依然可能出現寫入髒資料的情況。
對於volatile關鍵字,當且僅當滿足以下所有條件時可使用:
1. 對變數的寫入操作不依賴變數的當前值,或者你能確保只有單個執行緒更新變數的值。2. 該變數沒有包含在具有其他變數的不變式中。
volatile和synchronized的區別
關於可見性的問題 可見性 即當讀寫兩個執行緒同時訪問同乙個變數時,用於確保寫執行緒更新變數後,讀執行緒再訪問該 變數時可以讀取到該變數最新的值。volatile和synchronized的區別 1.volatile本質是在告訴jvm當前變數在暫存器 工作記憶體 中的值是不確定的,需要從主存中讀取 s...
volatile和synchronize的區別
1.對變數的寫入操作不依賴變數的當前值,或者你能確保只有單個執行緒更新變數的值。2.該變數沒有包含在具有其他變數的不變式中。volatile僅能使用在變數級別 synchronized則可以使用在變數 方法 和類級別的 volatile僅能實現變數的修改可見性,不能保證原子性 而synchroniz...
volatile和synchronized的區別
public class runthread extends thread public void setrunning boolean isrunning override public void run system.out.println 執行緒執行完成了 public class run c...