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

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

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

  • 引用类型。

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

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

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

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

  • IntPtr 和 UIntPtr。

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

示例

下面的示例说明如何将公共字段变量声明为 volatile

class VolatileTest
{public volatile int i;public void Test(int _i){i = _i;}
}

示例

下面的示例演示如何创建辅助线程,并用它与主线程并行执行处理。 有关多线程处理的背景信息,请参阅 线程和线程。

using System;
using System.Threading;public class Worker
{// This method is called when the thread is started.public void DoWork(){while (!_shouldStop){Console.WriteLine("Worker thread: working...");}Console.WriteLine("Worker thread: terminating gracefully.");}public void RequestStop(){_shouldStop = true;}// Keyword volatile is used as a hint to the compiler that this data// member is accessed by multiple threads.private volatile bool _shouldStop;
}public class WorkerThreadExample
{static void Main(){// Create the worker thread object. This does not start the thread.Worker workerObject = new Worker();Thread workerThread = new Thread(workerObject.DoWork);// Start the worker thread.
        workerThread.Start();Console.WriteLine("Main thread: starting worker thread...");// Loop until the worker thread activates.while (!workerThread.IsAlive) ;// Put the main thread to sleep for 1 millisecond to// allow the worker thread to do some work.Thread.Sleep(1);// Request that the worker thread stop itself.
        workerObject.RequestStop();// Use the Thread.Join method to block the current thread // until the object's thread terminates.
        workerThread.Join();Console.WriteLine("Main thread: worker thread has terminated.");}// Sample output:// Main thread: starting worker thread...// Worker thread: working...// Worker thread: working...// Worker thread: working...// Worker thread: working...// Worker thread: working...// Worker thread: working...// Worker thread: terminating gracefully.// Main thread: worker thread has terminated.
}

C#中的volatile关键字相关推荐

  1. 如何理解 JAVA 中的 volatile 关键字

    如何理解 JAVA 中的 volatile 关键字 最近在重新梳理多线程,同步相关的知识点.关于 volatile 关键字阅读了好多博客文章,发现质量高适合小白的不多,最终找到一篇英文的非常通俗易懂. ...

  2. java中的Volatile关键字使用

    文章目录 什么时候使用volatile Happens-Before java中的Volatile关键字使用 在本文中,我们会介绍java中的一个关键字volatile. volatile的中文意思是 ...

  3. Java中的Volatile如何工作? Java中的volatile关键字示例

    如何在Java中使用Volatile关键字 在Java采访中,什么是volatile变量以及何时在Java中使用volatile变量是Java 采访中一个著名的多线程采访问题 . 尽管许多程序员都知道 ...

  4. 深入理解Java中的volatile关键字

    在再有人问你Java内存模型是什么,就把这篇文章发给他中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized ...

  5. C++中的volatile关键字

    1.使用 volatile int i = 10; 2.使用volatile时要几个注意的点: volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素(操作系统.硬 ...

  6. java中的me关键字_java中的volatile关键字

    一.详细解释 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并 ...

  7. java 中violate_Java中的volatile关键字及Cache更新

    Volatile [ˈvɑːlətl],中文解释:反复无常的,易变的,不稳定的. volatile的本意是告诉编译器,此变量的值是易变的,每次读写该变量的值时务必从该变量的内存地址中读取或写入,不能为 ...

  8. java 中violate_Java中的Volatile关键字

    Java的volatile关键字用于标记一个Java变量为"在主存中存储".更确切的说,对volatile变量的读取会从计算机的主存中读取,而不是从CPU缓存中读取,对volati ...

  9. java关键字const_Java 中的 volatile 关键字

    Java 中 volatile 关键字是一个类型修饰符.JDK 1.5 之后,对其语义进行了增强. 保证了不同线程对共享变量进行操作时的可见性,即一个线程修改了共享变量的值,共享变量修改后的值对其他线 ...

  10. C++ 中的volatile关键字解析

    volatile 关键字是一种类型修饰符,和 const 对应,用来修饰变量.用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统.硬件或者其它线程等.遇到这个关键字声明的变量,编译器 ...

最新文章

  1. 【每日DP】day1 P1802 5倍经验日(别样的01背包)难度⭐★
  2. 【阿里云课程】深度学习模型设计:卷积核的设计与优化
  3. 2016年蓝桥杯省赛A组c++第8题(暴力求解)
  4. git提交到github总是要输入密码_push到github时,每次都要输入用户名和密码的问题...
  5. 【回文数】算法优化笔记
  6. conky在ubuntu xfce4下面的配置
  7. C++之静态成员变量和静态成员函数
  8. 第 6-5 课:MyBatis 核心和面试题(下)
  9. 转行进入测试一年有感
  10. Java 抽象类 接口
  11. SUMO交通流仿真实战
  12. 炒股50问——走向职业操盘的简单问答!
  13. 特定数量的商品如何在高并发下进行库存锁定 ?
  14. 自动布局神器 -- ZXPAutoLayout框架的使用
  15. vue2和vue3关闭语法检查
  16. java中base64编码加密和android中base64编码加密不一样?base64编码解析错误?
  17. Cursor的使用和下载
  18. 微信小游戏申请注册流程+开发微信小游戏类目需要具备条件
  19. 智能问答(Question Answering)的主要研究方向
  20. html5制作奥运五环,第一讲:使用html5——canvas绘制奥运五环

热门文章

  1. 开源 java CMS - FreeCMS2.3会员我的简历
  2. excel判断单元格包含指定内容的函数用=IF(COUNTIF(A1,*内容*),0,1)
  3. 最长公共子序列 (nyoj36) [动态规划]
  4. 启用sharepoin2013中的ChartWebPart
  5. 小程序 Serverless: 解放生产力,驱动研发效能提升
  6. snmp信息的查询命令snmpwalk
  7. Visual C++中的ODBC编程
  8. 40个视差滚动效果网站的新技术应用
  9. 深入学习heritrix---体系结构(Overview of the crawler)
  10. 专业的优化服务,就是为你争取时间!