1、當乙個變數被定義為volatile時,這個變數對所有執行緒是可見的,就是說當乙個執行緒修改了這個變數時,其他執行緒讀取到的永遠是修改後的最新的值。
但不能因為這樣就說基於volatile變數的運算在併發下是安全的,比如多個執行緒對乙個資料進行++操作時:當前執行緒讀取到的是最新的值,但是在它對資料進行++時,別的執行緒可能也對此時的資料進行了++操作,這就導致當前執行緒的++操作是無效的。
2、volatile關鍵字還能禁止指令重排序列化。
例如:指令1把a的值加10,指令2把a的值乘2,指令3把b的值加1。因為指令1和2有依賴關係,所以他們不會重排序,但指令3在執行的時候可能排到1之前或者1和2的中間。
3、使用volatile關鍵字要比其他同步工具更快。
volatile進行讀操作時效能消耗跟普通變數幾乎沒有什麼差距,但是寫操作可能會慢一些,因為它需要在本地**中插入記憶體屏障指令來禁止重排序。即便如此,它的效能消耗大多數情況下也要比鎖低
使用volatile關鍵字需要滿足的條件:
1、寫入變數時並不依賴變數的當前值,或者能確保只有單一執行緒修改變數的值
2、變數不需要與其他狀態變數共同參與不變約束
3、訪問變數時,沒有其他原因需要加鎖
關鍵字 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...