C# 參考html
volatile
關鍵字指示一個字段能夠由多個同時執行的線程修改。 聲明爲 volatile
的字段不受編譯器優化(假定由單個線程訪問)的限制。 這樣能夠確保該字段在任什麼時候間呈現的都是最新的值。安全
volatile
修飾符一般用於由多個線程訪問、但不使用 lock 語句對訪問進行序列化的字段。多線程
volatile
關鍵字可應用於如下類型的字段:優化
引用類型。ui
指針類型(在不安全的上下文中)。 請注意,雖然指針自己能夠是可變的,可是它指向的對象不能是可變的。換句話說,不能聲明「指向可變對象的指針」。spa
類型,如 sbyte、byte、short、ushort、int、uint、char、float 和 bool。線程
具備如下基類型之一的枚舉類型:byte、sbyte、short、ushort、int 或 uint。指針
已知爲引用類型的泛型類型參數。code
IntPtr 和 UIntPtr。htm
可變關鍵字僅可應用於類或結構的字段。 不能將局部變量聲明爲 volatile
。
volatile 字面意思是易變的,不穩定的。在C#中也能夠這麼理解。
編譯器在優化代碼時,可能會把訪問頻繁的數據和指令複製到Cache中,而後下一次調用就直接讀取Cache,這樣就提升了執行效率。
可是問題也隨之而來,在多線程中,若是把一個變量複製到Cache後,又有其餘線程改變了變量的值,那麼本線程是沒法知道這個變化的,它可能會直接讀取Cache裏的數據。
可是Cache裏的數據已通過期了,讀出來的是不合時宜的髒數據,這樣就會出現BUG。
用volatile聲明變量能夠解決這個問題,volatile修飾變量,就至關於告訴編譯器不要把這個變量放到Cache,由於這個變量可能被多線程訪問,會發生變化。