惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
N
News and Events Feed by Topic
Recent Announcements
Recent Announcements
D
Docker
M
MIT News - Artificial intelligence
L
LangChain Blog
I
InfoQ
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Proofpoint News Feed
博客园_首页
MongoDB | Blog
MongoDB | Blog
美团技术团队
S
Schneier on Security
G
GRAHAM CLULEY
月光博客
月光博客
有赞技术团队
有赞技术团队
Vercel News
Vercel News
Scott Helme
Scott Helme
P
Privacy International News Feed
Last Week in AI
Last Week in AI
Recorded Future
Recorded Future
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Cloudflare Blog
Attack and Defense Labs
Attack and Defense Labs
Google Online Security Blog
Google Online Security Blog
Simon Willison's Weblog
Simon Willison's Weblog
量子位
S
Security @ Cisco Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V
Visual Studio Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
NISL@THU
NISL@THU
N
Netflix TechBlog - Medium
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Spread Privacy
Spread Privacy
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
罗磊的独立博客
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threatpost
L
Lohrmann on Cybersecurity
www.infosecurity-magazine.com
www.infosecurity-magazine.com
S
Security Affairs
Cloudbric
Cloudbric
爱范儿
爱范儿
H
Heimdal Security Blog
PCI Perspectives
PCI Perspectives

博客园 - lzhdim

JavaScript 中的原型与继承 1分钟查清局域网所有IP 20260714 - 个人小作品更新 WorkBuddy 完整教程手册 专为AI而生的企业级QLC SSD!长江存储PE501 61.44TB评测:超过1PB的写入测试 32GB显存才是第一生产力!英特尔锐炫 Pro B70评测:中小企业AI降本神器 JavaScript中的this关键字 C#开发的PopoSaver泡泡屏保应用 - 开源研究系列文章 - 个人小作品 6天不间断测试告诉你到底有多省电!米家空调巨省电大1.5匹评测:制冷峰值功率不超过500W 三倍双摄加持 + D-Log 2 曲线!大疆DJI OSMO Pocket 4P全面评测:补齐短板,化身口袋电影机 晶栈4.0闪存立威!长江存储致态TiPro9000 2TB SSD评测:缓外写入超4GB/s独一档 JavaScript作用域与闭包讲解 最受欢迎的 10 大免费 AI 工具 六种AI生意,从月入一万到月入十万 5个国产大模型实测对比2026:DeepSeek、Kimi、豆包、通义、智谱哪个好用 豆包、元宝、千问、Kimi、DeepSeek,这么多AI软件,到底该用哪个? 微软免费开源了一个 Linux 操作系统,没错!是微软出品 一次看懂5种咖啡冲煮方式:意式、手冲、法压、冷萃、摩卡壶到底有什么区别 120个 实用CSS 技巧汇总合集 JavaScript运算符与表达式详解 C#开发的ScreenSaver屏保应用 - 开源研究系列文章 - 个人小作品 WinForm 中跨线程操作 UI 的解决方案 JavaScript变量与数据类型详解 苹果良心!iOS 27适配设备公布:30款机型 7年前的iPhone 11还能升级 C++图形用户界面开发入门 10个不该免费的GitHub神级项目 JavaScript语言全面概述:从历史到现代实践 一张图看懂常见咖啡 C盘空间多出来4GB:谷歌服软 Chrome本地AI大模型可禁用、删除了 96GB显存运行230B大模型!七彩虹灵创K16笔记本评测:160W性能释放 AMD锐龙AI Max+ 395加持全能移动AI工作站 AI PC最强存储搭档!雷克沙NM1090 PRO 8TB固态评测:14400MB/s满速不缩水 C#已经不是当年的C#了——我用它写了个微秒级数据库引擎 EasyTool:轻量全能的 .NET 工具类库 SQL 入门 17:MySQL 数据类型:从字符串到 JSON 的全面解析 SQL 入门 16:SQL 事务隔离级别与死锁解析(易懂) 原相3955XM+TL3228主控!小米电竞鼠标2全面评测:原生双8K究竟有多强 PCIe 4.0火力全开:闪迪奥丁马仕GX 7100 NVMe SSD上手 超乎预料的千元级电竞主板!七彩虹iGame B850M Ultra-OC V14主板评测 SQL 入门 15:SQL 事务:从 ACID 到四种常见的并发问题 名人 - 我的闪存 C#性能优化技巧 SQL 入门 14:SQL 触发器与事件:自动化数据处理 38个实用的JavaScript 技巧 一款基于 .Net WinForm 开发的节点编辑器,纯 GDI 实现,体积仅 100+Kb Masuit.Tools:这个 C# 工具库 SQL 入门 13:SQL 存储过程与函数:封装逻辑与参数处理 49个 JavaScript 代码快捷技巧,让你在 2026 年成为代码高手 20260503 - 个人小作品更新 SQL 入门 12:SQL 视图:创建、修改与可更新视图 C#如何实现Windows系统桌面截图功能... 6999元AMD新旗舰首测!锐龙9 9950X3D2性能解禁:这颗U根本不是给游戏玩家造的 SQL 入门 11:日期时间格式化、IF、CASE的使用 基于C#的校时类库的实现及使用 - 开源项目研究文章 39g无打孔+原生双8K!雷柏VT0 Air MAX / VT3s Air MAX鼠标评测:轻到飞起还快到极致 WinForm 中控件自适应窗体变化 20260413 - 个人小作品更新 SQL 入门 10:SQL 内置函数:数值、字符串与时间处理 最强麒麟芯+自研风冷 华为Mate80 Pro MAX 风驰版全面评测:涡轮散热封神 性能稳到骨子里 WiFi8核心技术特性与性能分析 2026年最新AMD/Intel桌面CPU排名:多线程、单线程、游戏性能谁才是第一 用DG对C盘进行扩容 - 初学者系列 - 学习者系列 还有比它更强的OEM固态吗!长江存储PC550 1TB评测:不用散热片也能满速的PCIe 5.0 SSD SharpCompress:跨平台的 C# 压缩与解压库 SQL 入门 9:SQL 高级子查询:ANY、EXISTS 与多位置应用 盘点接私活20个最实用的 .NET 开源项目 C#中加载图片的资源释放 20260404 - 个人小作品更新 开启iphone的墙纸玻璃效果 可能是综合性能最强的PCIe 5.0 SSD!铠侠EXCERIA PRO G2 2TB评测:AIDA64线性写入全程不掉速 SQL 入门 8:SQL 复杂查询:子查询与ALL关键词 性能最强的锐龙AI 9 H 465轻薄本!华硕无畏Pro16锐龙版2026评测 4盘RAID 0读写超1100MB/s!希捷酷狼Pro 32TB硬盘评测:百万文件快速完成备份 项目(Project)、项目集(Program)、项目组合(Portfolio) SQL 入门 7:SQL 聚合与分组:函数、GROUP BY 与 ROLLUP
C# 多线程同步机制详解:原理、使用与性能对比
lzhdim · 2026-07-06 · via 博客园 - lzhdim

前言

在多线程编程中,线程之间的资源共享和并发访问可能导致数据竞争、死锁等严重问题。因此,线程同步机制是保障程序正确性和稳定性的重要手段。

C# 提供了多种同步机制,包括 lock、Interlocked、Monitor、SpinLock、WaitHandle、Mutex、Semaphore、Events、Barrier 和 ReaderWriterLockSlim 等。它们虽然都用于线程同步,但在底层实现、适用场景和性能特点上各有不同。

本文将从底层原理、使用方式、性能对比等方面对这些机制进行系统性分析,帮助开发根据实际需求选择最合适的同步策略。

正文

1、lock 关键字

底层操作

  • lock 是基于 Monitor 实现的语法糖。
  • 编译器会自动生成 try-finally 块,确保锁的释放。

特点

  • 基于内核对象(SyncBlock)。
  • 使用简单,适合保护简单的共享资源。
  • 可能引入死锁问题。

示例代码

private staticreadonlyobject _lock = newobject();
privatestaticint _counter = 0;

public static void IncrementCounter()
{
    lock (_lock)
    {
        _counter++;
    }
}

2、Interlocked 类

底层操作

  • 利用 CPU 的原子指令(如 LOCK CMPXCHG)实现。
  • 不涉及锁,直接操作内存。

特点

  • 轻量级,性能高。
  • 仅支持简单类型(如 int, long)的原子操作。

示例代码

private static int _counter = 0;

public static void IncrementCounter()
{
    Interlocked.Increment(ref _counter);
}

3、Monitor 类

底层操作

  • 基于 CLR 内部结构 SyncBlock。
  • 支持 Enter/Exit、Wait/Pulse 等复杂控制。

特点

  • 比 lock 更灵活,适用于复杂逻辑。
  • 性能较低,涉及内核切换。

示例代码

private staticreadonlyobject _lock = newobject();

public static void DoWork()
{
    Monitor.Enter(_lock);
    try
    {
        // 临界区代码
    }
    finally
    {
        Monitor.Exit(_lock);
    }
}

4、SpinLock 结构

底层操作

  • 使用自旋机制,在获取锁失败时不断尝试。
  • 基于 CPU 原子操作实现。

特点

  • 避免上下文切换开销,适合短时间等待。
  • 长时间等待浪费 CPU 资源。

示例代码

private static SpinLock _spinLock = new SpinLock();

public static void DoWork()
{
    bool lockTaken = false;
    try
    {
        _spinLock.Enter(ref lockTaken);
        // 临界区代码
    }
    finally
    {
        if (lockTaken)
            _spinLock.Exit();
    }
}

5、WaitHandle 类

底层操作

  • 基于内核对象(事件、信号量、互斥体)。
  • 支持跨进程同步。

特点

  • 适用于复杂的线程通信。
  • 性能较低,因为涉及内核切换。

示例代码

private static EventWaitHandle _waitHandle = new AutoResetEvent(false);

public static void DoWork()
{
    _waitHandle.WaitOne(); // 等待信号
    // 继续执行
}

public static void Signal()
{
    _waitHandle.Set(); // 发送信号
}

6、Mutex 类

底层操作

  • 基于内核对象的互斥体。
  • 支持递归锁和跨进程同步。

特点

  • 重量级,性能较低。
  • 适用于跨进程资源访问控制。

示例代码

private static Mutex _mutex = new Mutex();

public static void DoWork()
{
    _mutex.WaitOne();
    try
    {
        // 临界区代码
    }
    finally
    {
        _mutex.ReleaseMutex();
    }
}

7、Semaphore 类

底层操作

  • 基于内核对象的信号量。
  • 控制多个线程同时访问资源。

特点

  • 支持资源池管理。
  • 允许多个线程同时访问,但数量有限。

示例代码

private static Semaphore _semaphore = new Semaphore(3, 3); // 最多允许3个线程访问

public static void DoWork()
{
    _semaphore.WaitOne();
    try
    {
        // 临界区代码
    }
    finally
    {
        _semaphore.Release();
    }
}

8、Events 类

底层操作

  • 基于事件对象,支持手动或自动重置。

特点

  • 灵活的线程间通信方式。
  • 性能低,适合通知类任务。

示例代码

private static ManualResetEventSlim _event = new ManualResetEventSlim(false);

public static void DoWork()
{
    _event.Wait(); // 等待信号
    // 继续执行
}

public static void Signal()
{
    _event.Set(); // 发送信号
}

9、Barrier 类

底层操作

  • 自旋 + 内核事件结合实现。
  • 多线程分阶段同步。

特点

  • 适用于并行计算中的阶段性同步。
  • 性能较高,适合多线程协同。

示例代码

private static Barrier _barrier = new Barrier(3); // 等待3个线程

public static void DoWork()
{
    // 执行部分工作
    _barrier.SignalAndWait(); // 等待其他线程
    // 继续执行
}

10、ReaderWriterLockSlim 类

底层操作

  • 自旋 + 内核事件结合实现。
  • 支持读写分离,提升并发性能。

特点

  • 读操作可并发执行。
  • 写操作独占资源。

示例代码

private static ReaderWriterLockSlim _rwLock = new ReaderWriterLockSlim();

public static void Read()
{
    _rwLock.EnterReadLock();
    try
    {
        // 读取操作
    }
    finally
    {
        _rwLock.ExitReadLock();
    }
}

public static void Write()
{
    _rwLock.EnterWriteLock();
    try
    {
        // 写入操作
    }
    finally
    {
        _rwLock.ExitWriteLock();
    }
}

总结对比表

同步机制

底层实现

性能

适用场景

跨进程支持

递归锁支持

lock

Monitor

中等

简单临界区保护

Interlocked

CPU 原子指令

简单数值操作

Monitor

SyncBlock

中等

复杂同步逻辑

SpinLock

自旋等待

短时间临界区

WaitHandle

内核事件

信号通知

Mutex

内核互斥体

跨进程同步

Semaphore

内核信号量

资源限制访问

Events

内核事件

信号通知

Barrier

自旋+事件

多线程同步点

ReaderWriterLockSlim

自旋+事件

读写分离场景

选择建议

  • 高性能场景:优先选择 Interlocked、SpinLock 或 ReaderWriterLockSlim。
  • 简单同步:使用 lock 或 Monitor。
  • 复杂同步:使用 WaitHandle、Events 或 Barrier。
  • 跨进程同步:使用 Mutex 或 Semaphore。

总结

每种同步机制都有其独特的优势和局限性。在实际开发中,应根据具体场景选择最合适的机制:

  • 如果你追求极致性能,且只处理简单变量操作,可以考虑 Interlocked;
  • 如果需要更细粒度的控制,可以使用 Monitor;
  • 如果你需要避免线程频繁切换,可以使用 SpinLock;
  • 如果你要实现读写分离,提高并发性能,可以选择 ReaderWriterLockSlim;
  • 如果你面对的是跨进程资源竞争,那么 Mutex 和 Semaphore 是理想选择。

掌握这些机制的底层原理和使用方法,有助于编写出更加高效、稳定、安全的多线程程序。