[英]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.