0

0

C# volatile关键字的作用 - 保证多线程下的可见性

星降

星降

发布时间:2025-12-04 12:05:02

|

283人浏览过

|

来源于php中文网

原创

volatile 关键字确保多线程下字段的可见性,使读写直接操作主内存、禁止部分重排序;但不保证原子性,仅适用于简单类型字段的单次读写,不能替代锁或用于复合操作。

c# volatile关键字的作用 - 保证多线程下的可见性

volatile 关键字在 C# 中主要用于确保多线程环境下字段的可见性。当一个字段被声明为 volatile,意味着对该字段的读写操作不会被线程本地缓存,所有线程都会直接从主内存中读取或写入该值,从而避免因缓存不一致导致的数据问题。

什么是可见性问题?

在多线程程序中,每个线程可能有自己的寄存器或缓存,用于提高性能。如果一个线程修改了共享变量的值,这个修改可能只发生在该线程的本地缓存中,其他线程无法立即看到更新后的值。这种现象就是可见性问题

例如:

  • 线程 A 修改了一个布尔标志 isCompleted = true
  • 线程 B 在循环中检查这个标志是否为 true;
  • 由于线程 B 可能一直使用缓存中的旧值,它永远看不到改变,导致死循环。

volatile 如何解决可见性?

将共享字段标记为 volatile 后,.NET 运行时会保证:
  • 每次读取该字段时,都从主内存中获取最新值;
  • 每次写入该字段时,立即刷新到主内存;
  • 禁止某些类型的指令重排序(提供一定的内存屏障作用)。

示例代码:

Copy.ai
Copy.ai

Copy.ai 是一个人工智能驱动的文案生成器

下载
private volatile bool _shouldStop = false;

// 线程1执行 public void Worker() { while (!_shouldStop) { // 做一些工作 } Console.WriteLine("工作结束"); }

// 线程2调用,通知停止 public void StopWork() { _shouldStop = true; }

在这个例子中,如果不加 volatile,Worker 方法可能永远看不到 _shouldStop 的变化。加上后,就能确保一旦 StopWork 被调用,Worker 线程能尽快感知到状态变更。

volatile 的限制

volatile 并不能替代锁机制,它只保证可见性和一定程度的有序性,但不保证原子性。
  • 适用于简单类型(如 bool、int、引用类型等)的读写操作;
  • 不适合复合操作,比如 count++(读-改-写),这类仍需使用 lockInterlocked 类;
  • 不能用于属性,只能用于字段;
  • 在大多数现代硬件和 .NET 实现中,volatile 读写会有轻微性能开销,但通常可接受。

总结

volatile 是一种轻量级同步机制,适用于需要跨线程传递状态信号的场景,比如控制循环退出、标志位通知等。它通过强制读写主内存来保障变量的可见性,是编写高效、正确多线程程序的重要工具之一。

基本上就这些,用得不多但关键时候很管用。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

197

2023.11.20

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

197

2023.11.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

538

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

52

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

69

2025.10.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.9万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 12.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号