關於Volatile關鍵字的一點理解
阿新 • • 發佈:2019-01-04
今天在看ImageLoader的原始碼的時候看到ImageLoader類裡面的單例模式的類物件宣告為<span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px; background-color: rgb(238, 238, 238);">Volatile,由於自己以前也沒接觸到這個關鍵字,所以就百度一下,然後發現網上總說紛紜,有的說執行緒安全,有的說不是,網上找的一段程式碼。</span>
public class Counter { public static int count = 0; public static void inc() { //這裡延遲1毫秒,使得結果明顯 try { Thread.sleep(1); } catch (InterruptedException e) { } count++; } public static void main(String[] args) { //同時啟動1000個執行緒,去進行i++計算,看看實際結果 for (int i = 0; i < 1000; i++) { new Thread(new Runnable() { @Override public void run() { Counter.inc(); } }).start(); } //這裡每次執行的值都有可能不同,可能為1000 System.out.println("執行結果:Counter.count=" + Counter.count); } }
這裡輸出的值Count不是1000,不信的可以去測試一下,但是並不因為他輸出的值就說他不是執行緒安全了,因為子執行緒並沒有全部執行完,所以這種方法並不可靠,於是再找資料,找到這麼一張圖
從這張圖可以看出,
<span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px; background-color: rgb(238, 238, 238);">Volatile關鍵字只不過保證值從主存傳遞到執行緒工作記憶體的時候是同步的,並不保證寫的時候安全,所以會發生讀寫不同步的問題,所以一般建議使用synchronized來控制。如果上面有什麼錯誤還請批評指正,由於本人還是在學習階段=。=</span>