1

AFAIK,这两个版本之间存在差异lock

框架 4 增加了一项检查监视器输入期间是否存在异常(如内存不足异常)

并且有一个lockTaken标志指示是否应该(在finally子句中)释放锁(由于try子句中的代码失败)。

就像是

bool lockTaken = false;
try
{
   Monitor.Enter (lockObj, ref lockTaken);
   ...
}
finally { if (lockTaken) Monitor.Exit (lockObj); }

(非常类似于using代码(处置...))

但是通过反射器观看我看到完全不同的东西:

[SecuritySafeCritical]
public static void Enter(object obj, ref bool lockTaken)
{
    if (lockTaken)
    {
        throw new ArgumentException(Environment.GetResourceString("Argument_MustBeFalse"), "lockTaken");
    }
    ReliableEnter(obj, ref lockTaken);
}

最后尝试的模式在哪里?

我错过了什么?

4

1 回答 1

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);
  }
}
于 2012-11-29T12:01:39.920 回答