0

0

c# 在高并发下使用静态变量的注意事项

星降

星降

发布时间:2026-01-12 02:55:29

|

153人浏览过

|

来源于php中文网

原创

静态变量非线程安全,因所有线程共享同一内存;需用Interlocked、Concurrent集合或显式锁保护,避免竞态、内存泄漏与资源泄露。

c# 在高并发下使用静态变量的注意事项

静态变量在多线程环境里不是线程安全的

静态变量属于类型级别,所有线程共享同一份内存。如果多个线程同时读写同一个 static 字段(比如 static int counter),不加同步就可能丢失更新、读到脏值,甚至触发不可预测的行为。

常见错误现象包括:计数器增长慢于预期、对象状态错乱、NullReferenceException(尤其在静态初始化未完成时被其他线程访问)。

  • 不要直接对 static 字段做 ++--、赋值等非原子操作
  • 避免在静态构造函数中执行耗时或依赖外部资源的操作(如数据库连接、HTTP 调用),它只执行一次且阻塞所有后续线程
  • 静态字段若引用可变对象(如 static List Items),需确保该对象本身线程安全,或统一加锁访问

Interlocked 替代简单算术操作

对整型、引用类型等基础操作,Interlocked 提供无锁、原子的线程安全方法,性能远高于 lock,适合高频计数、标志位切换等场景。

例如:Interlocked.Increment(ref counter)lock(obj) { counter++; } 更轻量;Interlocked.CompareExchange 可实现乐观并发控制。

  • Interlocked.AddInterlocked.ExchangeInterlocked.CompareExchange 是常用组合
  • 注意:仅适用于支持的类型(intlongIntPtr、引用类型等),不能用于 decimal 或自定义结构
  • 不要试图用 Interlocked 保护多步逻辑(如“先读再写”),它只保证单个操作原子性

静态集合要用线程安全版本或显式同步

.NET 提供了 ConcurrentDictionaryConcurrentQueueConcurrentStack 等开箱即用的线程安全集合。它们内部采用细粒度锁或无锁算法,比手动 lock 更高效、更不易出错。

创想商务B2B网站橙色模板
创想商务B2B网站橙色模板

创想商务B2B网站管理系统(橙色风格版)V3.0 注意事项:该风格模板基于创想商务B2B网站管理系统(v3.0)使用。 部分特色功能如下: 1、一健在线安装 : 2、商铺独立二级域名: 3、阶梯价批发: 4、零售商城: 5、会员等级自由转换: 6、在线交易: 7、会员商家多方位推广: 8、多种赢利模式: 9、分类多属性关联: 10、自主风格模板设计: 11、HTML静态化处理: 12、灵活SEO

下载

如果你坚持用 static Liststatic Dictionary,就必须为每个读写入口显式加锁,且锁对象必须是私有静态字段(不能是 this 或公共实例),否则会锁不住。

  • 优先选 ConcurrentDictionary 而非 static Dictionary + lock
  • ConcurrentBag 适合高并发生产者-消费者场景,但不保证遍历顺序
  • 即使用了线程安全集合,复合操作(如“检查是否存在再添加”)仍需额外同步,因为 ContainsKey + TryAdd 不是原子的

静态缓存要小心生命周期和内存泄漏

静态变量生命周期贯穿整个 AppDomain(.NET Framework)或进程(.NET Core/5+),不会被 GC 回收。如果静态字段持有大量数据(如缓存了成千上万的 byte[] 或未释放的 IDisposable 对象),极易导致内存持续增长、OOM。

典型问题:用 static Dictionary 做缓存但没设过期策略或大小限制;缓存了事件处理器却忘了反订阅,造成对象无法释放。

  • 考虑用 MemoryCache.DefaultIMemoryCache(ASP.NET Core)替代裸静态字典,它支持过期、大小限制、回调清理
  • 若必须用静态集合,定期清理或使用弱引用(WeakReference)缓存大对象
  • 静态字段引用的 IDisposable 实例(如 static FileStream)需在程序退出前显式释放,否则资源泄露
public static class CounterService
{
    private static long _hitCount = 0;
    private static readonly ConcurrentDictionary _cache = new();

    public static long IncrementHit() => Interlocked.Increment(ref _hitCount);

    public static bool TryGetCachedValue(string key, out int value) =>
        _cache.TryGetValue(key, out value);

    public static void SetCachedValue(string key, int value) =>
        _cache[key] = value; // ConcurrentDictionary 自动线程安全
}
静态变量不是不能用,而是每处读写都要问一句:这个操作是否会被多个线程同时触发?有没有隐式依赖顺序?它的生命周期是否可控?漏掉其中任何一个,都可能在高并发下突然暴露。

相关专题

更多
string转int
string转int

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

315

2023.08.02

string转int
string转int

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

315

2023.08.02

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

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

534

2024.08.29

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

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

51

2025.08.29

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

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

194

2025.08.29

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

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

479

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.12.07

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

80

2026.01.09

热门下载

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

精品课程

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

共28课时 | 3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

Sass 教程
Sass 教程

共14课时 | 0.8万人学习

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

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