C#多线程实现数据排他锁的两种方法

Aria
Aria
发布时间:2026-10-16| 10人浏览过
原创

在多任务并行处理场景下,如何避免多线程同时读取或修改共享数据导致的冲突?本文将详细介绍C#中使用锁机制(Lock)保护关键代码块的方法,确保线程安全与数据一致性。

多线程并发中的数据提取问题

当系统需要启动大量线程批量刷新一张表的数据时,若未采取控制措施,各线程极有可能获取到相同的记录片段,造成数据冗余或逻辑错误。为了解决这一挑战,必须引入互斥机制来限制对共享资源(如数据库连接、全局变量等)的并发访问。

第一种写法:使用 this 作为锁对象

在类内部实例方法中直接使用 this 进行锁定。这种方式最为简洁,适用于锁的范围覆盖整个实例对象方法的场景。

private List<Company> GetData()
{
    // 以当前实例对象作为锁体
    lock (this)
    {
        // 这里放置从数据库或内存中提取数据的逻辑
        return list;
    }
}

原理说明: 当一个线程执行到 lock (this) 时,系统将检查该实例对象的互斥量是否被占用。若未被占用,线程获得锁并继续执行;若已被其他线程占用,当前线程将被阻塞挂起,直到持有锁的线程执行完毕并释放锁。此时所有试图调用此方法的线程都会排队等待,直至上一个调用结束。

第二种写法:使用独立 Object 作为锁对象

为了避免外部干扰以及更细粒度地控制锁定范围,推荐创建一个专用的私有只读字段(通常命名为 _lockObj)来进行锁定。这样可以避免 public 方法因锁被外部代码持有而导致死锁。

// 必须在类级别定义,且应为 readonly
private object _lockObj = new object();

private List<CkbCom> GetData(int index, int pagesize)
{
    // 仅锁定特定代码块,不影响类的其他公共属性或方法
    lock (_lockObj)
    {
        var list = ckbbll.FindList($"com_id >={index} and com_id < {index + pagesize}");
        
        // 更新索引,确保下一次调用获取不重叠的数据段
        index += pagesize;

        return list;
    }
}

优点解析: 这种写法精准锁定了“提取数据”及“更新指针”这两步核心逻辑。它保证了在同一时间点只有一个线程能进入该方法块,从而实现了真正的排他性。

完成判断与注意事项

  • 正确性验证: 运行多线程测试后,观察返回的 list 集合。如果所有数据项无重复且全部被覆盖,则说明排他锁生效,逻辑设计合理。
  • 参数选择: this 适用于轻量级类内部同步;new object() 适用于需要精细控制锁范围以避免不必要阻塞的场景。
  • 性能提示: 锁越宽,并发能力越低。请将锁定范围严格控制在必要的临界区内,减少不必要的线程等待时间。

以上就是C#多线程排他锁实现的详细内容,更多关于C#并发编程与锁机制的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。