本文主要總結常用的volatile方式。
1. 迴圈檢測(單純寫,單純讀,不涉及變數的複雜操作)
private volatile boolean stop = false;
// 執行在多個執行緒中
void dosomework()
}// 執行在多個執行緒中
void stop()
為什麼這個是最佳實踐呢?
原因是相對於使用鎖來說,volatile的讀取效率很高,但是寫的效率不一定很高。
因為在實際執行的彙編**中會加入lock標記,防止重排序,這就增加了寫的負擔。
但是以上的最佳實踐,剛好利用了這個特點。
我們在控制線程的開始和結束的時候,往往會加乙個控制變數,會經常的讀,但寫可能只會發生一次,這正好符合這個特點。
最佳實踐就是——這樣用保證沒有錯。
除此之外,使用volatile的過程中還要注意這些。
2. 雙重檢測鎖
private volatile static singleton singleton;
public static singleton getinstance()}}
return singleton;
}
此種最佳實踐的原因是volatile可以禁止指令重排序(物件在初始化的時候會出現重排序的優化)
可以防止多執行緒在獲取單例物件是空指標的異常。
關鍵字 volatile關鍵字的作用
1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...
關鍵字volatile詳解
與關鍵字const一樣,關鍵字volatile也是乙個型別修飾符 type specifier 關於volatile的作用 例如程式清單 volatile int m 10 int k,n m k i volatile將告訴編譯器,整形變數m是隨時發生變化的,每次使用m的時候,都要求從m的位址中找出...
volatile關鍵字 詳解
volatile 關鍵字 volatile關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改,比如 作業系統 硬體或者其它執行緒等。遇到這個關鍵字宣告的變數,編譯器對訪問該變數的 就不再進行優化,從而可以提供對特殊位址的穩定訪問。使用該關鍵字的例子如下 int volati...