volatile 關鍵字專題

2021-10-08 21:06:50 字數 1697 閱讀 7589

[3] volatile在什麼情況下可以替代鎖?

[1] 談一下你對 volatile 關鍵字的理解?

**答:**volatile 關鍵字是用來保證有序性和可見性的。

保證了不同執行緒對該變數操作的記憶體可見性;

禁止指令重排序。

解析:

volatile變數的開銷:

volatile不會導致執行緒上下文切換,但是其讀取變數的成本較高,因為其每次都需要從快取記憶體或者主記憶體中讀取,無法直接從暫存器中讀取變數。

[2]volatile如何保證可見性和有序性?

主記憶體與工作記憶體

volatile修飾的共享變數進行寫操作的時候多出一條帶lock字首的指令,lock字首的指令在多核處理器下會引發兩件事情

將當預處理器快取行的資料寫回到系統記憶體。

這個寫回記憶體的操作會使在其他cpu裡快取了該記憶體位址的資料無效。

為了提高處理速度,處理器不直接和記憶體進行通訊,而是先將系統記憶體的資料讀到內部快取後再進行操作,但是操作完了不知道什麼時候寫回記憶體。而對宣告了volatile關鍵字的變數進行寫操作,jvm會向處理器傳送一條lock字首的指令,將這個變數所在的快取行立即寫回系統記憶體。並且為了保證各個處理器的快取是一致的,實現了快取一致性協議,各個處理通過嗅探在匯流排上傳播的資料來檢查自己快取的值是不是過期了,當處理器發現自己快取行對應的記憶體位址被修改,就會將當預處理器的快取行設定成無效狀態,那麼下次對這個資料進行操作,就會重新從系統記憶體中獲取最新的值。對應jmm來說就是:

lock字首的指令讓執行緒工作記憶體中的值寫回主記憶體中;

通過快取一致性協議,其他執行緒如果工作記憶體中存了該共享變數的值,就會失效;

其他執行緒會重新從主記憶體中獲取最新的值;

2.有序性的

為了效能優化,jvm會在不改變資料依賴性的情況下,允許編譯器和處理器對指令序列進行重排序,而有序性問題指的就是程式**執行的順序與程式設計師編寫程式的順序不一致,導致程式結果不正確的問題。而加了volatile修飾的共享變數,則通過記憶體屏障解決了多執行緒下有序性問題。

內次屏障分為以下4類:volatile在寫操作前後插入了記憶體屏障後生成的指令序列,示意圖如下:

volatile在讀操作後面插入了記憶體屏障後生成的指令序列示意圖如下:

[3] volatile在什麼情況下可以替代鎖?

volatile是乙個輕量級的鎖,適合多個執行緒共享乙個狀態變數,鎖適合多個執行緒共享一組狀態變數。可以將多個執行緒共享的一組狀態變數合併成乙個物件,用乙個volatile變數來引用該物件,從而替代鎖。

理解volatile和cas配合使用原理

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