【C#】关键字 volatile

volatile 是 C# 中一个用于多线程编程的关键字 ,作用是确保变量的可见性 ------ 也就是说,一个线程对变量的修改,其他线程可以马上"看到"


🔍 为什么需要 volatile

在多线程中,CPU 和编译器可能会对代码进行优化,比如:

  • 把变量缓存到寄存器或 CPU cache 中;
  • 重排指令顺序;
  • 延迟同步内存中的变量值。

结果就是:

一个线程改了变量,另一个线程却看不到最新的值


volatile 的作用

volatile 告诉编译器和 CPU:"这个变量很重要,别给我优化!随时读写内存中的真实值。"


📌 用法语法

csharp 复制代码
private volatile bool _running = true;

void ThreadMethod()
{
    while (_running)
    {
        // do work
    }
}

这样,另一个线程如果设置 _running = false;,这个线程能立刻感知到,不会卡在死循环中。


🧠 举个例子(不加 volatile 出问题)

csharp 复制代码
bool running = true;

new Thread(() =>
{
    while (running) { }
}).Start();

Thread.Sleep(1000);
running = false; // 👈 这里设置为 false,线程可能 **看不到**!

这段代码可能会卡死,因为 running 被缓存了,线程读取的是老值。


✅ 加上 volatile:

csharp 复制代码
volatile bool running = true;

new Thread(() =>
{
    while (running) { }
}).Start();

Thread.Sleep(1000);
running = false; // 👈 线程立刻感知,安全退出

⚠️ 注意事项

  1. volatile 只能用于字段(field),不能用于局部变量或属性。
  2. volatile 只适用于以下类型:
    • bool
    • byte, sbyte
    • short, ushort
    • int, uint
    • char
    • float
    • object, enum, IntPtr, UIntPtr, long*, double* 等指针类型
  3. volatile 不等于线程安全,它不保证原子性,只能保证"可见性"。

🧠 总结一句话:

volatile 让你在线程之间正确地观察到变量的变化,适合用于控制标志位(如循环退出),但不适合用于计数器、队列等需要原子操作的场景。

相关推荐
ytttr87321 分钟前
基于 C# WinForm 实现的 电影院售票系统
开发语言·c#
Tony Bai36 分钟前
Goroutine “气泡”宇宙——Go 并发模型的新维度
开发语言·后端·golang
Larry_Yanan1 小时前
Qt多进程(二)QProcess+stdio
开发语言·qt
码农葫芦侠1 小时前
Qt 跨线程内存管理陷阱:QSharedPointer、deleteLater() 与 QPointer 的致命组合
开发语言·数据库·qt
d111111111d1 小时前
C语言中,malloc和free是什么,在STM32中使用限制是什么,该如何使用?
c语言·开发语言·笔记·stm32·单片机·嵌入式硬件·学习
网安_秋刀鱼1 小时前
【java安全】shiro鉴权绕过
java·开发语言·安全
白昼流星!1 小时前
C++内存四区与new操作符详解
开发语言·c++
tyatyatya1 小时前
MATLAB三维绘图教程:plot3/mesh/surf/contour函数详解与实例
开发语言·matlab
十五年专注C++开发1 小时前
标准C++操作文件方法总结
开发语言·c++·文件操作·ifstream
浔川python社1 小时前
《C++ 小程序编写系列》(第四部):实战:简易图书管理系统(类与对象篇)
java·开发语言·apache