大家最熟悉的保證執行緒安全的技術是lock和synchronized塊(後面就統稱鎖了),但如果在一些對排他性(一會介紹)沒有太多限制的變數上使用鎖會花費很多時間和資源,為了優化程式效能,就有了volatile。
鎖提供兩種特性:排他性和可見性。排他性很好理解,就是只有乙個執行緒可以對鎖住的東東進行操作。可見性就稍複雜,因為乙個執行緒修改了某個東東,你不能悄悄兒地改完就拔d無情地走了,你還需要把你改過的東東flush到記憶體,再「flush」到其他持有該變數的執行緒的cache中以保證對其他執行緒可見。(如果沒看懂,往下看)
volatile就提供了可見性,且只提供可見性(在這兩個特性中還有其他的後面介紹)。現在就來說說為什麼要提供這個可見性。
隨著這個技術的發展啊,出現了一種cpu叫做多核cpu,當你的多執行緒程式執行的時候,每乙個執行緒可能不在同乙個cpu中跑,而jvm為了提公升效率,讀取變數的值通常是讀取cpu的cache,多核cpu就有多個cache,這就出現問題了!!很有可能每個cache中的值都不一樣。
這個時候給你的變數使用volatile關鍵字,就會告訴jvm,給老子直接去記憶體讀資料!不光如此,如果在乙個執行緒中修改了乙個volatile變數,jvm會把所有對這個執行緒可見的變數flush到記憶體。
除了可見性,還有乙個功能就是把對long和double的讀寫變成原子的(在一些機器上對這倆的讀寫是分成兩次32位的讀寫)。
由此可見,當乙個變數的寫操作不依賴於當前值和其他程式狀態時,你就可以使用volatile,也就是不需要排他性的時候。
java中 this,final,super關鍵字
1.this關鍵字 1 this表示當前類的例項化物件。2 this呼叫本類中的屬性,如果本類中沒有此屬性,將從父類中繼續查詢。3 this呼叫本類中的方法,如果本類中沒有此方法,將從父類中繼續查詢。4 this可以呼叫本類中的構造方法。class person 呼叫自身的構造方法,這種寫法只能存在...
Java中的volatile關鍵字
執行緒1 boolean stop false while stop 執行緒2 stop true 第二 使用volatile關鍵字的話,當執行緒2進行修改時,會導致執行緒1的工作記憶體中快取變數stop的快取行無效 反映到硬體層的話,就是cpu的l1或者l2快取中對應的快取行無效 第三 由於執行緒...
java多執行緒中volatile的理解
一 使用runnable來實現多執行緒 package com.xiancheng.old public class threadold implements runnable catch interruptedexception e falg true public boolean isfalg ...