恐怕比較一下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...