当前位置: 首页 > news >正文

C#中Interlocked.Exchange的作用

在 C# 中,Interlocked.Exchange 是一个用于 多线程原子操作 的关键方法,其核心作用是 以线程安全的方式交换变量的值。以下是它的详细说明:

核心作用

原子性操作
在无锁(lock-free)的多线程编程中,Interlocked.Exchange 能够确保以下两个操作作为一个 不可分割的原子操作 完成:

  1. 读取 变量的当前值

  2. 写入 新值到该变量

这避免了线程竞争(Race Condition)导致的数据不一致问题。

方法签名

public static T Exchange<T>(ref T location, T value) where T : class;
public static int Exchange(ref int location, int value);
// 其他重载支持 long、float、double 等类型
  • 输入:通过 ref 传递的变量引用(location)和新值(value)。

  • 输出:返回变量被修改前的 原始值

典型使用场景

  1. 线程安全的标志位切换

    private bool _isRunning;
    
    public void Stop()
    {
        // 原子性地将 _isRunning 设为 false,并返回之前的值
        bool original = Interlocked.Exchange(ref _isRunning, false);
        if (original)
        {
            Console.WriteLine("成功停止");
        }
    }

  2. 无锁编程中的状态更新

    private object _currentData;
    
    public void UpdateData(object newData)
    {
        // 原子性替换数据,并获取旧数据以进行清理
        object oldData = Interlocked.Exchange(ref _currentData, newData);
        if (oldData != null)
        {
            Cleanup(oldData);
        }
    }

  3. 单次初始化(如单例模式)

    private object _singletonInstance;
    private readonly object _lock = new object();
    
    public object GetInstance()
    {
        if (_singletonInstance == null)
        {
            var temp = new object();
            // 原子性竞争创建实例
            Interlocked.CompareExchange(ref _singletonInstance, temp, null);
        }
        return _singletonInstance;
    }

性能优势

  • 避免锁开销与 lock 语句相比,Interlocked 类的方法直接利用 CPU 的原子指令(如 x86 的 XCHG),无需上下文切换或阻塞线程。

  • 轻量级适合高频调用的简单操作

注意事项

  1. 适用范围仅适用于简单的值替换操作,复杂逻辑需结合 Interlocked.CompareExchange 或锁。

  2. 引用类型:泛型版本 (Interlocked.Exchange<T>) 支持引用类型,但需注意内存可见性问题(可通过 volatile 关键字或内存屏障解决)。

相关文章:

  • vmware虚拟机快照、克隆、迁移区别说明
  • sonar代码检测研究及平台搭建
  • Vue+SpringBoot:整合JasperReport作PDF报表,并解决中文不显示问题
  • 统计可重复列表中的TOP N
  • 路由工程师大纲-3:结合AI技术进行路由策略优化的知识链体系
  • P1102 A-B 数对
  • github_本地项目上传到远程
  • python 模拟登录
  • 阶跃星辰 Step-Video-TI2V 图生视频模型深度解析
  • 自由学习记录(47)
  • 10分钟读完《有限与无限的游戏》
  • 两个手机都用流量,IP地址会一样吗?深入解析
  • 【计算机网络】TCP协议技术细节全解析:与UDP的核心差异深度对比
  • 餐饮管理系统的设计与实现(代码+数据库+LW)
  • 新书速览|云原生Kubernetes自动化运维实践
  • 2024年数维杯数学建模B题生物质和煤共热解问题的研究解题全过程论文及程序
  • Linux运维篇-系统io调优
  • 《基于Python的财务数据可视化与决策支持系统开发》开题报告
  • 如何用大模型评估大模型——PAI-Judge裁判员大语言模型的实现简介
  • 2. 初识go-zero
  • 马上评|房屋“注胶堵漏”骗局何以屡屡得逞
  • 周国辉谈花开岭现象 :年轻的公益人正在用行动点亮希望
  • 人民日报和音:相信中国就是相信明天
  • 知名中医讲师邵学军逝世,终年51岁
  • 北邮今年本科招生将首次突破四千人,新增低空技术与工程专业
  • 杨建全已任天津市委副秘书长、市委市政府信访办主任