c# lock 和Monitor

相同点:

  1. 两者都用于实现线程同步,确保在多线程环境中对共享资源的互斥访问

  2. 都是基于 .NET 中的 Monitor 类实现的同步机制

不同点

Monitor.Enter

  • 是 Monitor 类的静态方法

  • 需要显式调用 Monitor.Exit 来释放锁

  • 如果临界区抛出异常,可能导致锁无法释放(死锁风险)

  • 更底层,更灵活

  • 可以配合 Monitor.TryEnter 实现带超时的锁获取

lock 语句

  • 是 C# 的语言级关键字

  • 实际上是 Monitor.Enter 和 Monitor.Exit 的语法糖

  • 自动生成 try-finally 块确保锁会被释放

  • 代码更简洁,更安全

  • 不支持超时设置

最佳实践

  1. 优先使用 lock - 它更简洁且能自动处理异常情况

  2. 只有在需要超时或其他高级功能时才使用 Monitor.Enter/TryEnter

  3. 确保锁定的对象是引用类型且不可变(通常使用 private readonly object syncLock = new object();)(因为lock的内部实现其实是使用Monitor,如果lock过程中,被lock的对象被修改了,有可能导致Monitor.Exit释放失败,造成死锁)

posted @ 2025-04-28 16:31  my-sky  阅读(51)  评论(0)    收藏  举报