MSDN上說:
volatile 關鍵字指示一個字段能夠由多個同時執行的線程修改。 聲明爲 volatile 的字段不受編譯器優化的限制。 這樣能夠確保該字段在任什麼時候間呈現的都是最新的值。
安全
volatile 關鍵字可應用於如下類型的字段:多線程
引用類型。app
指針類型(在不安全的上下文中)。 請注意,雖然指針自己能夠是可變的,可是它指向的對象不能是可變的。 換句話說,您沒法聲明「指向可變對象的指針」。優化
類型,如 sbyte、byte、short、ushort、int、uint、char、float 和 bool。ui
具備如下基類型之一的枚舉類型:byte、sbyte、short、ushort、int 或 uint。spa
已知爲引用類型的泛型類型參數。線程
可變關鍵字僅可應用於類或結構字段。 不能將局部變量聲明爲 volatile。指針
網上看到一篇文章說:
對象
volatile關鍵字僅應用於類或結構字段,用於通知編譯器,將有多個線程訪問該字段,所以它不該當對此成員的狀態作任何優化,這樣能夠確保該字段在任什麼時候間呈現的都是最新的值。
不是全部的類型均可以被定義爲volatile字段,只有如下類型纔可被定義爲volatile:
引用類型。
指針類型(在不安全的上下文中)。
整型,如 sbyte、byte、short、ushort、int、uint、char、float 和 bool。
具備整數基類型的枚舉類型。
已知爲引用類型的泛型類型參數。
IntPtr 和 UIntPtr。
注意觀察一下,就能發現只有值或引用的位數不超過本機整型值的位數(在32位系統中,爲4個字節)的類型才能成爲volatile。爲何會這樣呢?個人理解是:編譯器之因此保障volatile字段在多線程狀況下老是獲取到最新值,最重要的一點是volatile字段操做的原子性,即編譯後的本地代碼只用一條機器指令就能對volatile字段賦值了。如何保證操做的原子性呢?32位系統中,對任何數據操做都是以4字節爲基礎,天然一條機器指定就能搞定執行一個小於4字節的賦值操做。但若是字段佔用內存大於4個字節,那生成賦值語句的機器指令確定大於一條,這樣在多線程的上下文切換中,有可能剛剛賦值到一半,就被切換到其餘線程了。這樣,便沒法保障volatile字段在多線程環境下老是呈現一個完整的、合法的最新值了。
總結:volatile關鍵字的目的就是在多線程訪問該字段時,保證任什麼時候間呈現的都是最新的值!