是雙重檢查鎖使用ReaderWriterLockSlim
時必要的模式?Double Check Lock模式應該與ReaderWriteLockSlim一起使用嗎?
請考慮這種情況:我有一個dictionary
。可以添加東西。但事情不能從中刪除。當添加東西時,它可能是一個非常昂貴的操作(只有幾百毫秒,但相對於應用程序的其餘部分而言仍然很昂貴)如果我想添加一些東西但它不在那裏,會不會有任何獲得通過:
- 第一獲取讀鎖,然後檢查存在,
- 然後進入一個可升級讀鎖,並且再次檢查,
- 然後進入一個寫鎖,如果該項目是仍然不存在於字典中?
類似以下內容:
void populateIfNotPresent(object thing)
{
_lock.EnterReadLock() ;
bool there = _dictionary.ContainsKey(thing);
_lock.ExitReadLock() ;
// Remember, the specs say nothing can be removed from this dictionary.
if (!there)
{
_lock.EnterUpgradeableReadLock() ;
try
{
if(!_dictionary.ContainsKey(thing))
{
_lock.EnterWriteLock() ;
try
{
populate(thing) ;
}
finally
{
_lock.ExitWriteLock() ;
}
}
}
finally
{
_lock.ExitUpgradeableReadLock() ;
}
}
}
文檔說在同一時間可以進入升級讀鎖只有一個線程,但不會進入一個讀鎖停止任何其他線程,因此看起來在雙重檢查鎖中存在價值。
您認爲如何?這是否過分矯枉過正?
這是類似於例如concurrentdictionary中的原子「添加如果不存在」的方法嗎?如果是這樣,那實施可能有助於看。 –
謝謝,是的,但是沒有擔心從字典中刪除的東西(再加上.NET 4之前的版本)。 –