編輯:從我已經是答案,我的理解是,我提出的,不是真正的「不堵寫着」第一個解決方案,因爲只有一個線程可以進入升級鎖和寫鎖可以沒有被採取之前讀取被釋放...ReaderWriterLockSlim VS雙鎖格紋圖案
所以我的問題,如何使正確的方式是第一個解決方案是「非阻塞閱讀」創建如果不存在?
我想了解兩個解決方案的非阻塞多線程讀取。是什麼下面兩種解決方案之間的差異(也許我還是不明白一些事情,但我想):
/// <summary>
/// ReaderWriterLockSlim pattern
/// </summary>
public class ReadWriteLockCheck
{
Dictionary<string, object> _dict = new Dictionary<string, object>();
private ReaderWriterLockSlim _rwLock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);
public void CreateByKey(string key)
{
_rwLock.EnterReadLock();
try
{
if (!_dict.ContainsKey(key)) //Non blocking read - Check if exists
{
_rwLock.EnterWriteLock(); //Lock
try
{
_dict.Add(key, new object());
}
finally
{
_rwLock.ExitWriteLock();
}
}
}
finally
{
_rwLock.ExitReadLock();
}
}
public bool GetByKey(string key)
{
_rwLock.EnterWriteLock();
try
{
if (_dict.ContainsKey(key)) //Non blocking read
{
return true;
}
return false;
}
finally
{
_rwLock.ExitReadLock();
}
}
}
/// <summary>
/// Double check lock pattern
/// </summary>
public class MonitorLock
{
Dictionary<string, object> _dict = new Dictionary<string, object>();
private object _syncObj = new Object();
public void CreateByKey(string key)
{
if (!_dict.ContainsKey(key)) //Non blocking read - Check if exists
{
Monitor.Enter(_syncObj); //Lock
try
{
if (!_dict.ContainsKey(key)) //Check if between first check and lock someone already added
{
_dict.Add(key, new object());
}
}
finally
{
Monitor.Exit(_syncObj);
}
}
}
public bool GetByKey(string key)
{
if (_dict.ContainsKey(key)) //Non blocking read
{
return true;
}
return false;
}
}
,因爲它看起來對我來說,這兩種解決方案可以使非阻塞的讀取和僅阻塞時寫作......如果是這樣,ReaderWriterLockSlim
的好處是什麼?正如我在google中發現的,Monitor
比ReaderWriterLockSlim
快得多。 當然我明白可能在閱讀時我會得到不正確的字典狀態,但對我來說沒問題。
感謝
爲什麼不選擇一個已經發明輪子呢? 'System.Collections.Concurrent.ConcurrentDictionary'? http://msdn.microsoft.com/en-us/library/dd287191.aspx –
spender
使用'Monitor.Enter' /'Monitor.Exit'沒有什麼好處 - 只需使用'lock';除了*更簡單*之外,它還處理了一些邊緣情況(它可以使用不同的'Enter'重載) –
@spender我看到了它,但是自.NET 4起可用的那個類,我們使用3.5 :( –