C#中有没有类似Java的ReentrantLock可重入锁

来源:菜鸟站长作者:河北彩花头衔:网络博主
导读:本期聚焦于小伙伴创作的《C#中有没有类似Java的ReentrantLock可重入锁》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#中有没有类似Java的ReentrantLock可重入锁》有用,将其分享出去将是对创作者最好的鼓励。

Java中的ReentrantLock是可重入的互斥锁,支持同一个线程多次获取锁而不会被阻塞,常用于多线程场景下的资源同步控制。C#作为同样支持多线程编程的语言,原生就提供了可重入锁的实现能力,不需要像Java那样单独引入特定的锁类就能实现相同的效果。

C#中有没有类似Java的ReentrantLock可重入锁

C#内置的可重入锁实现方式

1. 使用lock语句实现可重入锁

lock语句是C#中最常用的同步方式,它底层基于Monitor类实现,天然支持可重入特性。同一个线程可以多次进入lock保护的代码块,不会因为重复获取锁而导致死锁。

下面是一个lock语句实现可重入锁的示例:

using System;
using System.Threading;

class ReentrantLockDemo
{
    private static readonly object lockObj = new object();
    
    static void Main()
    {
        // 启动子线程执行可重入锁测试
        Thread thread = new Thread(ExecuteWithReentrantLock);
        thread.Start();
        thread.Join();
    }
    
    static void ExecuteWithReentrantLock()
    {
        Console.WriteLine("线程尝试第一次获取锁");
        lock (lockObj)
        {
            Console.WriteLine("第一次获取锁成功");
            // 同一个线程再次获取锁,不会阻塞
            lock (lockObj)
            {
                Console.WriteLine("第二次获取锁成功,可重入特性生效");
                DoAnotherWork();
            }
            Console.WriteLine("第一次锁的作用域结束");
        }
    }
    
    static void DoAnotherWork()
    {
        lock (lockObj)
        {
            Console.WriteLine("嵌套方法内获取锁成功");
        }
    }
}

运行上述代码可以看到,同一个线程三次获取同一个lock对象对应的锁都成功执行,不会出现阻塞,这就是可重入锁的典型表现。

2. 直接使用Monitor类实现可重入锁

lock语句本质是Monitor类的语法糖,我们也可以直接使用Monitor类的Enter和Exit方法来实现可重入锁,这种方式可以更灵活地控制锁的获取和释放逻辑。

使用Monitor类的示例代码如下:

using System;
using System.Threading;

class MonitorReentrantDemo
{
    private static readonly object monitorObj = new object();
    
    static void Main()
    {
        Thread worker = new Thread(ProcessWithMonitor);
        worker.Start();
        worker.Join();
    }
    
    static void ProcessWithMonitor()
    {
        // 获取锁
        Monitor.Enter(monitorObj);
        try
        {
            Console.WriteLine("Monitor第一次获取锁成功");
            // 再次获取同一个锁,可重入
            Monitor.Enter(monitorObj);
            try
            {
                Console.WriteLine("Monitor第二次获取锁成功");
            }
            finally
            {
                // 释放一次锁
                Monitor.Exit(monitorObj);
            }
        }
        finally
        {
            // 释放剩余的锁
            Monitor.Exit(monitorObj);
        }
    }
}

需要注意的是,使用Monitor类时,Enter的调用次数必须和Exit的调用次数一致,否则会导致锁无法正确释放,引发其他线程长时间阻塞的问题。

C#可重入锁与Java ReentrantLock的特性对比

我们可以通过下表对比C#的可重入锁实现和Java ReentrantLock的核心特性:

特性Java ReentrantLockC# lock/Monitor
可重入支持支持支持
公平锁支持构造时可指定公平/非公平不支持,默认非公平
中断响应支持lockInterruptibly方法Monitor.TryEnter支持超时,无中断响应
条件变量支持ConditionMonitor提供Wait、Pulse、PulseAll方法

使用注意事项

  • lock语句锁定的对象必须是引用类型,不能使用值类型,否则会导致每次锁定的是装箱后的不同对象,失去同步效果。
  • 锁对象的访问权限尽量设置为private static,避免外部代码意外获取锁导致死锁。
  • 不要在锁保护的代码块中执行耗时过长的操作,比如IO操作、网络请求等,会降低多线程的执行效率。
  • 如果需要类似Java ReentrantLock的公平锁、中断响应等高级特性,可以基于Monitor类自行封装,或者引入第三方的锁实现库。

总的来说,C#中不需要类似Java ReentrantLock的单独类,内置的lock语句和Monitor类已经完全支持可重入锁的所有基础能力,能够满足绝大多数多线程同步的开发需求。如果有特殊的高级特性要求,也可以通过扩展实现对应的功能。

C#ReentrantLock可重入锁lock语句Monitor类修改时间:2026-06-12 05:03:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。