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关键字的目的就是在多线程访问该字段时,保证任什么时候间呈现的都是最新的值!