c# lock 和Monitor
相同点:
-
两者都用于实现线程同步,确保在多线程环境中对共享资源的互斥访问
-
都是基于 .NET 中的 Monitor 类实现的同步机制
不同点
Monitor.Enter
-
是 Monitor 类的静态方法
-
需要显式调用
Monitor.Exit来释放锁 -
如果临界区抛出异常,可能导致锁无法释放(死锁风险)
-
更底层,更灵活
-
可以配合
Monitor.TryEnter实现带超时的锁获取
lock 语句
-
是 C# 的语言级关键字
-
实际上是 Monitor.Enter 和 Monitor.Exit 的语法糖
-
自动生成 try-finally 块确保锁会被释放
-
代码更简洁,更安全
-
不支持超时设置
最佳实践
-
优先使用 lock - 它更简洁且能自动处理异常情况
-
只有在需要超时或其他高级功能时才使用 Monitor.Enter/TryEnter
-
确保锁定的对象是引用类型且不可变(通常使用
private readonly object syncLock = new object();)(因为lock的内部实现其实是使用Monitor,如果lock过程中,被lock的对象被修改了,有可能导致Monitor.Exit释放失败,造成死锁)

浙公网安备 33010602011771号