C#之System.Threading.Lock与lock使用及区别

 更新时间:2026年05月26日 14:32:00   作者:xiaoshuaishuai8  
本文详细比较了C#中传统lock语句与System.Threading.Lock的异同,涵盖语法复杂度、异常处理、超时控制及性能影响等方面,帮助开发者选择合适的同步机制

System.Threading.Lock与lock语句的比较与差异

传统lock语句的用法

传统 lock 语句是 C# 中最常用的同步机制,用于确保代码块在多个线程中互斥执行。

其语法简洁,直接作用于对象引用。

private readonly object _lockObj = new object();

public void ThreadSafeMethod()
{
    lock (_lockObj)
    {
        // 临界区代码
    }
}

System.Threading.Lock的用法

System.Threading.Lock 是 .NET 中更底层的同步原语,提供更细粒度的控制。

它需要显式调用 EnterExit 方法。

private readonly object _lockObj = new object();

public void ThreadSafeMethod()
{
    bool lockTaken = false;
    try
    {
        System.Threading.Monitor.Enter(_lockObj, ref lockTaken);
        // 临界区代码
    }
    finally
    {
        if (lockTaken)
            System.Threading.Monitor.Exit(_lockObj);
    }
}

主要差异

语法复杂度

  • lock 语句语法更简洁,自动处理 Monitor.EnterMonitor.Exit
  • System.Threading.Monitor 需要手动管理锁的获取和释放。

异常处理

  • lock 语句在异常时自动释放锁。
  • System.Threading.Monitor 需在 finally 块中显式释放锁,否则可能导致死锁。

超时控制

  • lock 语句不支持超时机制。
  • System.Threading.Monitor.TryEnter 可设置超时时间,避免无限等待。
bool lockTaken = false;
try
{
    System.Threading.Monitor.TryEnter(_lockObj, 1000, ref lockTaken);
    if (lockTaken)
    {
        // 临界区代码
    }
    else
    {
        // 超时处理
    }
}
finally
{
    if (lockTaken)
        System.Threading.Monitor.Exit(_lockObj);
}

性能影响

  • lock 语句编译后实际转换为 System.Threading.Monitor 调用,性能差异可忽略。
  • 直接使用 Monitor 可优化特定场景(如超时控制)。

适用场景

优先使用 lock 语句

简单同步需求,代码可读性更重要时。

使用 System.Threading.Monitor

需要超时控制、更灵活的锁管理或与其他同步机制(如 Wait/Pulse)配合时。

注意事项

  • 避免锁定 public 对象或字符串,可能引发外部代码的意外死锁。
  • 确保锁范围尽可能小,减少线程阻塞时间。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C#开发的人脸左右相似度计算软件源码分析

    C#开发的人脸左右相似度计算软件源码分析

    这篇文章主要介绍了C#开发的人脸左右相似度计算软件,较为详细的分析了相似度计算的相关原理与具体实现技巧,需要的朋友可以参考下
    2015-04-04
  • C#实现图片缩略图功能的示例详解

    C#实现图片缩略图功能的示例详解

    这篇文章主要为大家详细介绍了如何利用C#实现图片缩略图的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C#并行编程Task类用法介绍

    C#并行编程Task类用法介绍

    这篇文章介绍了C#并行编程Task类的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C# 实现简易的串口监视上位机功能附源码下载

    C# 实现简易的串口监视上位机功能附源码下载

    这篇文章主要介绍了C# 实现简易的串口监视上位机功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 基于WPF平台使用纯C#制作流体动画的代码示例

    基于WPF平台使用纯C#制作流体动画的代码示例

    在 WPF 应用开发中,为界面添加生动的动画效果能显著提升用户体验,通常,我们会结合 XAML 和 C# 来打造各种动画,但今天我们聚焦于如何仅用纯 C# 在 WPF 平台上制作出令人惊艳的流体动画,感兴趣的小伙伴跟着小编一起来看看吧
    2025-01-01
  • C#在图片增加文字的实现代码

    C#在图片增加文字的实现代码

    最近做项目需要动态给图片增加文字(书本的封面图片),修改字体大小、字体、颜色、控制位置等,下面通过实例代码给大家分享C#在图片增加文字的实现代码,一起看看吧
    2017-06-06
  • C#中CheckedListBox控件的用法实例

    C#中CheckedListBox控件的用法实例

    最近用到checklistbox控件,在使用其过程中,花了较多的时间,这里我收集了其相关的代码段,希望对大家有所帮助,下面这篇文章主要给大家介绍了关于C#中CheckedListBox控件用法的相关资料,需要的朋友可以参考下
    2021-11-11
  • C#实现钟表程序设计

    C#实现钟表程序设计

    这篇文章主要为大家详细介绍了C#实现钟表程序设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C#选择法排序实例分析

    C#选择法排序实例分析

    这篇文章主要介绍了C#选择法排序,实例分析了C#实现选择法排序的原理与相关技巧,需要的朋友可以参考下
    2015-04-04
  • C#使用Windows Service的简单教程(创建、安装、卸载、调试)

    C#使用Windows Service的简单教程(创建、安装、卸载、调试)

    这篇文章主要为大家详细介绍了C#创建、安装、卸载、调试Windows Service(Windows 服务)的简单教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01

最新评论