AFAIK,这两个版本中lock
之间存在差异。
如果在监视器输入期间出现异常(例如内存异常),则框架4再添加一项检查
并且有一个lockTaken
标志,指示是否应该释放锁(在finally
子句中)(由于try
子句中的失败代码)。
像
这样的东西bool lockTaken = false;
try
{
Monitor.Enter (lockObj, ref lockTaken);
...
}
finally { if (lockTaken) Monitor.Exit (lockObj); }
(非常类似于using
代码(dispose ...))
但通过relfector查看我看到完全不同的事情:
[SecuritySafeCritical]
public static void Enter(object obj, ref bool lockTaken)
{
if (lockTaken)
{
throw new ArgumentException(Environment.GetResourceString("Argument_MustBeFalse"), "lockTaken");
}
ReliableEnter(obj, ref lockTaken);
}
最终尝试的模式在哪里?
我错过了什么?
答案 0 :(得分:3)
您应该查看使用lock
语句的反编译方法,而不是查看框架的代码。所以,如果您尝试反编译以下方法:
object syncRoot = new object();
void Foo()
{
lock(syncRoot) {}
}
你会看到你的期望:
void Foo()
{
bool lockTaken;
try
{
Monitor.Enter(syncRoot, out lockTaken);
}
finally
{
if (lockTaken)
Monitor.Exit(syncRoot);
}
}