在 C# 中什么时候使用 Monitor
类或 lock
关键字来保证线程安全?
编辑:
从目前的答案看来,lock
是对 Monitor
类的一系列调用的简写。 lock call 的简写到底是什么?或者更明确地说,
class LockVsMonitor
{
private readonly object LockObject = new object();
public void DoThreadSafeSomethingWithLock(Action action)
{
lock (LockObject)
{
action.Invoke();
}
}
public void DoThreadSafeSomethingWithMonitor(Action action)
{
// What goes here ?
}
}
更新
谢谢大家的帮助:我已经发布了另一个问题作为对你们提供的一些信息的跟进。由于您似乎精通该领域,因此我发布了链接:What is wrong with this solution to locking and managing locked exceptions?
最佳答案
Eric Lippert 在他的博客中谈到了这一点: Locks and exceptions do not mix
等效代码在 C# 4.0 和更早版本之间有所不同。
在 C# 4.0 中是:
bool lockWasTaken = false;
var temp = obj;
try
{
Monitor.Enter(temp, ref lockWasTaken);
{ body }
}
finally
{
if (lockWasTaken) Monitor.Exit(temp);
}
它依赖于 Monitor.Enter
在获取锁时自动设置标志。
早些时候是:
var temp = obj;
Monitor.Enter(temp);
try
{
body
}
finally
{
Monitor.Exit(temp);
}
这依赖于 Monitor.Enter
和 try
之间没有抛出异常。我认为在调试代码中违反了这个条件,因为编译器在它们之间插入了一个 NOP,从而使它们之间的线程中止成为可能。
关于c# - 监控与锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4978850/