Dot-Net

Monitor.TryEnter(object) 和 Monitor.TryEnter(object, ref bool) 之間存在什麼重要區別?

  • September 9, 2010

似乎這些程式碼片段的行為應該相同:

1:Monitor.TryEnter(對象)

if (Monitor.TryEnter(lockObject))
{
   try
   {
       DoSomething();
   }
   finally
   {
       Monitor.Exit(lockObject);
   }
}

2:Monitor.TryEnter(object, ref bool) - 在 .NET 4.0 中引入

bool lockAcquired;
try
{
   Monitor.TryEnter(lockObject, ref lockAcquired);
   if (lockAcquired)
   {
       DoSomething();
   }
}
finally
{
   if (lockAcquired)
   {
       Monitor.Exit(lockObject);
   }
}

我從 MSDN 文件中看到關於ref bool參數的重載:

如果由於拋出異常而沒有獲取鎖,則該方法結束後為lockTaken參數指定的變數為**false 。**這允許程序在所有情況下確定是否需要釋放鎖。

但是文件指出,僅採用object參數的重載不會引發除ArgumentNullException. 因此,似乎如果在上面的程式碼片段1中引發了異常,那可能只是因為lockObjectis null,在這種情況下,無論如何都沒有鎖定(並且TryEnter會返回false),因此Monitor.Exit不需要呼叫。

顯然,他們不會無緣無故地引入這種過載。那麼該Monitor.TryEnter(object, ref bool)方法打算解決什麼場景呢?

  1. Monitor.TryEnter 可能會成功,然後觸發非同步異常,例如 ThreadAbortException 或 OutOfMemoryException(可能在沒有可見分配的情況下發生)。然後鎖定將被佔用但從未釋放。

請參閱:鎖和異常不能混用

引用自:https://stackoverflow.com/questions/3674650