Dot-Net

.NET ReaderWriterLockSlim 問題

  • July 20, 2015

有很多關於 ReaderWriterLockSlim 類的文章,它允許多次讀取和一次寫入。所有這些(至少是我發現的)都告訴瞭如何使用它,而沒有太多解釋它為什麼以及如何工作。標準程式碼範例是:

lock.EnterUpgradeableReadLock();

try
{
  if (test if write is required)
  {
     lock.EnterWriteLock();

     try
     {
         change the resourse here.
     }
     finally
     {
        lock.ExitWriteLock();
     }
  }
}
finally
{
  lock.ExitUpgradeableReadLock();
}

問題是:如果可升級鎖只允許單個執行緒進入它的部分,我為什麼要在其中呼叫 EnterWriteLock 方法?如果我不這樣做會怎樣?或者,如果我將呼叫 EnterWriteLock 而不是 EnterUpgradeableReadLock 並在不使用可升級鎖的情況下寫入資源,將會發生什麼?

使用EnterUpgradeableReadLockover的好處EnterReadLock是,您可以確定在檢查條件和實際進入寫鎖之間,您為確定是否進入寫鎖而檢查的條件不會改變。lock這避免了正常s可能需要的重複:

if (whatever-condition)
{
   lock (_lockObject)
   {
       // the condition may have changed betwen the check and the lock; verify
       // that the condition is still valid
       if (whatever-condition)
       {
           // do the stuff
       }
   }
}

同時,它不會阻塞對 的呼叫EnterReadLock,因此其他執行緒仍可能在程式碼的其他部分獲得讀取訪問權限(當然,這些呼叫會阻塞對 的呼叫,EnterWriteLock直到它們釋放讀取鎖為止)。

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