當多個執行緒操作共享資料時,執行緒先讀取記憶體中的資料,並各自快取乙份,然後對快取資料進行修改,最後再寫入到記憶體中,但有時候由於程式執行速度快(如while
操作),導致沒有及時去記憶體中讀取新的資料,而此時有可能其它執行緒已經修改了共享的資料,這就可能導致程式執行出現不可想象的偏差,而volatile
就是為了防止這種偏差出現。
volatile
可保證記憶體中的資料可見(就是每次都會去讀記憶體中的資料,而不是快取中的資料)。相較於synchronized
是一種較為輕量級的同步策略。
案例分析:
public
class
testvolatile
}*/// 情況二:加鎖、效率較低
/*while (true)
}}*/
// 情況三:使用volatile
while
(true)}
}}class
threaddemo
implements
runnable
catch
(interruptedexception e)
flag =
true
; system.out.
println
("flag = "
+flag);}
public
boolean
isflag()
public
void
setflag
(boolean flag)
}
注意:
1、volatile
不具備「互斥性」。也就是說,volatile
修飾的變數允許多個執行緒讀寫,而具有「互斥性」的synchronized
同時只允許乙個執行緒讀寫。
2、volatile
不能保證變數的「原子性」。也就是說,volatile
修飾的變數的讀、寫操作是可分割的。
java 中volatile關鍵字
1.volatile關鍵字往往用於多執行緒,保證了執行緒可以正確讀取其他執行緒傳入的值。2.volatile的特殊規則保證了volatile變數值修改後的新值立刻同步到主記憶體,每次使用volatile變數前立即從主記憶體中重新整理,因此volatile保證了多執行緒之間的操作變數的可見性,而普通變...
java中關鍵字volatile
1.用在多執行緒同步變數時,執行緒為了提高效率,將某成員變數 如a 拷貝了乙份 如b 執行緒中對a的訪問其實訪問的是b。只在某些動作時才進行a和b的同步。因此存在a和b不一致的情況。volatile就是用來避免這種情況的。volatile告訴jvm,它所修飾的變數不保留拷貝,直接訪問主記憶體中的 也...
JAVA中的volatile關鍵字
大家最熟悉的保證執行緒安全的技術是lock和synchronized塊 後面就統稱鎖了 但如果在一些對排他性 一會介紹 沒有太多限制的變數上使用鎖會花費很多時間和資源,為了優化程式效能,就有了volatile。鎖提供兩種特性 排他性和可見性。排他性很好理解,就是只有乙個執行緒可以對鎖住的東東進行操作...