lock是Monitor的语法糖,编译后转为Monitor.Enter和Monitor.Exit的try-finally结构,确保异常时锁能释放;Monitor提供超时、Wait/Pulse等更细粒度控制;建议一般用lock,复杂场景选Monitor,并注意锁对象安全与配对调用。

在C#中,lock 和 Monitor 都用于实现线程同步,防止多个线程同时访问共享资源。它们本质上是紧密相关的,但使用方式和灵活性有所不同。理解它们的联系与区别,有助于写出更安全、高效的多线程代码。
lock 是 Monitor 的语法糖
lock 关键字实际上是 Monitor.Enter 和 Monitor.Exit 的简写形式。当你写一段 lock 代码时,编译器会自动将其转换为使用 Monitor 的 try-finally 结构,确保即使发生异常也能正确释放锁。
例如,下面这段代码:
lock (obj){
// 临界区
}
会被编译器翻译成:
bool lockTaken = false;try
{
Monitor.Enter(obj, ref lockTaken);
// 临界区
}
finally
{
if (lockTaken) Monitor.Exit(obj);
}
这种转换保证了线程安全和锁的正确释放,避免死锁或资源泄漏。
Monitor 提供更精细的控制
虽然 lock 使用简单,但 Monitor 类提供了更多高级功能,适合复杂场景:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~