C# volatile 摘录

C# 参考

volatile 关键字指示一个字段可以由多个同时执行的线程修改。 声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。 这样可以确保该字段在任何时间呈现的都是最新的值。

volatile 修饰符通常用于由多个线程访问、但不使用 lock 语句对访问进行序列化的字段。

volatile 关键字可应用于以下类型的字段:

  • 引用类型。

  • 指针类型(在不安全的上下文中)。 请注意,虽然指针本身可以是可变的,但是它指向的对象不能是可变的。换句话说,不能声明“指向可变对象的指针”。

  • 类型,如 sbyte、byte、short、ushort、int、uint、char、float 和 bool。

  • 具有以下基类型之一的枚举类型:byte、sbyte、short、ushort、int 或 uint。

  • 已知为引用类型的泛型类型参数。

  • IntPtr 和 UIntPtr。

可变关键字仅可应用于类或结构的字段。 不能将局部变量声明为 volatile

其他参考

volatile 字面意思是易变的,不稳定的。在C#中也可以这么理解。

编译器在优化代码时,可能会把访问频繁的数据和指令复制到Cache中,然后下一次调用就直接读取Cache,这样就提高了执行效率。

但是问题也随之而来,在多线程中,如果把一个变量复制到Cache后,又有其他线程改变了变量的值,那么本线程是无法知道这个变化的,它可能会直接读取Cache里的数据。

但是Cache里的数据已经过期了,读出来的是不合时宜的脏数据,这样就会出现BUG。

用volatile声明变量可以解决这个问题,volatile修饰变量,就相当于告诉编译器不要把这个变量放到Cache,因为这个变量可能被多线程访问,会发生变化。

posted on 2018-07-25 16:19  aeiiilowx  阅读(154)  评论(0编辑  收藏  举报