2
我正在使用Enterprise Lib 5.0高速緩存應用程序塊,並試圖找出在多線程場景下處理讀取/寫入的最佳方法。 正在寫入鎖而不鎖定閱讀推薦的方法?基於企業庫的共享高速緩存的讀取/寫入
Update(string key, object value)
{
lock(syncLock)
{
cacheManager.Add(key,value);
}
}
object Read(string key)
{
object o = cacheManager.GetData(key);
return o;
}
//OR is the following Read recommended using a lock
object Read(string key)
{
lock(syncLock)
{
object o = cacheManager.GetData(key);
return o;
}
}
我擔心的是,如果一個線程即將在另一個線程要讀的項目爲同一key.Can這項事業的比賽,同時更新特定關鍵的項目?
將「keys」字典添加到「ReaderWriterLockSlim」中是否有意義,這樣您就可以基本上只對一個特定的按鍵執行鎖定,而不會像多線程場景中的「常見」應用:
基本上是這樣的:
Dictionary<string,ReaderWriterLockSlim> dict = new Dictionary<string,ReaderWriterLockSlim>();
void Update(string key, object value)
{
dict[key].EnterWriteLock();
cacheManager.Add(key,value);
dict[key].ExitWriteLock();
}
object Read(string key)
{
dict[key].EnterReadLock();
object o = cacheManager.GetData(key);
dict[key].ExitReadLock();
return o;
}
難道你仍然想要鎖定最初將項目添加到緩存的邏輯嗎? IE:如果GetData == Null {Add} ...但是如果另一個線程調用你的空檢查和你的Add ala某種形式的[雙重檢查](http://en.wikipedia.org/wiki/Double- checked_locking) – felickz
@felickz:是的 - 這是一個很好的區別 - 如果您調用多個方法(如Contains,然後添加),並希望它們是原子,那麼你將不得不同步訪問。 –