volatile關鍵字詳解

2021-09-12 21:20:04 字數 818 閱讀 7751

可見性

意思就是說,在多執行緒環境下,某個共享變數如果被其中乙個執行緒給修改了,其他執行緒能夠立即知道這個共享變數已經被修改了,當其他執行緒要讀取這個變數的時候,最終會去記憶體中讀取,而不是從自己的工作空間中讀取。

例如我們上面說的,當執行緒1對t進行了加1操作並把資料寫回到主存之後,執行緒2就會知道它自己工作空間內的t已經被修改了,當它要執行加1操作之後,就會去主存中讀取。這樣,兩邊的資料就能一致了。

假如乙個變數被宣告為volatile,那麼這個變數就具有了可見性的性質了。這就是volatile關鍵的作用之一了。

快取一致性協議

剛才我在說可見性的時候,說「如果乙個共享變數被乙個執行緒修改了之後,當其他執行緒要讀取這個變數的時候,最終會去記憶體中讀取,而不是從自己的工作空間中讀取」,實際上是這樣的:

執行緒中的處理器會一直在匯流排上嗅探其內部快取中的記憶體位址在其他處理器的操作情況,一旦嗅探到某處處理器打算修改其記憶體位址中的值,而該記憶體位址剛好也在自己的內部快取中,那麼處理器就會強制讓自己對該快取位址的無效。所以當該處理器要訪問該資料的時候,由於發現自己快取的資料無效了,就會去主存中訪問。

有序性如果乙個變數被宣告volatile的話,那麼這個變數不會被進行重排序,也就是說,虛擬機會保證這個變數之前的**一定會比它先執行,而之後的**一定會比它慢執行。

volatile關鍵字能夠保證**的有序性,這個也是volatile關鍵字的作用。

總結一下,乙個被volatile宣告的變數主要有以下兩種特性保證保證執行緒安全。

可見性。

有序性。

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

詳解Volatile關鍵字

volatile應用場景 2.volatile 產生的原因 3.總結 4.深入理解volatile 編譯器優化 c關鍵字volatile memory破壞描述符 對於c編譯器來說,它並不知道這個值會被其他執行緒修改。自然就把它cache在暫存器裡面。記住,c 編譯器是沒有執行緒概念的!這時候就需要用...