Dot-Net
.NET ReaderWriterLockSlim 問題
有很多關於 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直到它們釋放讀取鎖為止)。