同步 volatile關鍵字

2021-08-30 11:07:41 字數 912 閱讀 6592

volatile是一種比sychronized關鍵字更輕量級的同步機制

訪問volitile變數時,不會執行加鎖操作

訪問非volitile變數時,每個執行緒會從系統記憶體(主記憶體)拷貝變數到工作記憶體中,然後修改工作記憶體中的變數值,操控的變數可能不同,造成混亂。

volatile修飾的變數,是直接拿的主記憶體的值,就是說這個值永遠是最新的,對其他執行緒是可見的。

volatile的讀寫操作是原子性的。***lile變數進行頻繁的++操作,就會失去原子性。假如執行緒a和執行緒b,同時對0進行++操作100次,結果可能小於200.

使用volitile之後,有兩個特性:

保證此變數對多個執行緒的可見性,當某乙個執行緒修改了變數,新值會立即同步到主記憶體;

禁止指令重排序,記憶體屏障(保證讀和寫的原子性,不能被任何其他操作打斷):讀-loadload-loadstore;sotrestore-寫-storeload。

loadload:後面的讀和前面的讀,不會重排序

loadstore:後面的寫和前面的讀,不會重排序

storestore:前面的寫和後面的寫,不會重排序

storeload:後面的讀和前面的寫,不會重排序

寫完修改了工作記憶體中的變數,然後把這個變數賦值到主記憶體;通知舊值失效(快取(工作記憶體)失效)。

什麼叫作快取失效機制?

定義乙個volatile boolean flag = false;

第乙個執行緒進行寫操作,run},5秒後(thread.sleep(5000)),將flag賦值為true;

第二個執行緒,讀到的flag==fasle,那麼也會一直列印,如果此時看到flag已經是true了,這個時候,此執行緒中的工作記憶體變數(flag==false),會失效。

如果沒有採用快取失效機制,那麼執行緒得到的flag值,不具備時效性,會列印多餘的內容,影響結果。

關鍵字 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...