C 中volatile的用法

2021-10-19 14:53:37 字數 585 閱讀 4911

恐怕比較一下volatile和synchronized的不同是最容易解釋清楚的。volatile是變數修飾符,而synchronized則作用於一段**或方法;看如下三句get**:

int i1;              int geti1() 

volatile int i2;  int geti2() 

int i3;              synchronized int geti3() 

更通俗的解釋:

volatile 字面的意思時易變的,不穩定的。在c#中也差不多可以這樣理解。

編譯器在優化**時,可能會把經常用到的**存在cache裡面,然後下一次呼叫就直接讀取cache而不是記憶體,這樣就大大提高了效率。但是問題也隨之而來了。

在多執行緒程式中,如果把乙個變數放入cache後,又有其他執行緒改變了變數的值,那麼本執行緒是無法知道這個變化的。它可能會直接讀cache裡的資料。但是很不幸,cache裡的資料已經過期了,讀出來的是不合時宜的髒資料。這時就會出現bug。

用volatile宣告變數可以解決這個問題。用volatile宣告的變數就相當於告訴編譯器,我不要把這個變數寫cache,因為這個變數是可能發生改變的。

C 中volatile的用法

恐怕比較一下volatile和synchronized的不同是最容易解釋清楚的。volatile是變數修飾符,而synchronized則作用於一段 或方法 看如下三句get inti1 intgeti1 volatile inti2 int geti2 int i3 synchronized in...

C中的volatile用法

volatile 影響編譯器編譯的結果,指出,volatile 變數是隨時可能發生變化的,與volatile變數有關的運算,不要進行編譯優化,以免出錯,vc 在產生release版可執行碼時會進行編譯優化,加volatile關鍵字的變數有關的運算,將不進行編譯優化。例如 volatile int i...

C中的volatile用法

volatile 影響編譯器編譯的結果,指出,volatile 變數是隨時可能發生變化的,與volatile變數有關的運算,不要進行編譯優化,以免出錯,vc 在產生release版可執行碼時會進行編譯優化,加volatile關鍵字的變數有關的運算,將不進行編譯優化。例如 volatile int i...