簡體   English   中英

鎖定Framework 3.5 vs 4.0?

[英]Lock in Framework 3.5 vs 4.0?

AFAIK ,這2個版本的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);
}

最后,嘗試的模式在哪里?

我錯過了什么?

您應該看一下使用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);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM