锁定Framework 3.5 vs 4.0?

时间:2012-11-29 11:49:04

标签: c# .net multithreading .net-4.0 locking

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);
}

最终尝试的模式在哪里?

我错过了什么?

1 个答案:

答案 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);
  }
}