2011-09-16 44 views
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; 
} 

回答

2

你不應該做自己的鎖定與The Caching Application Block,因爲「你放心,在一個線程安全的方式塊執行」。

如果您針對Cache的源代碼看看,你會看到AddRemoveGetData方法都進行鎖定在內存中緩存執行任何操作之前。

+0

難道你仍然想要鎖定最初將項目添加到緩存的邏輯嗎? IE:如果GetData == Null {Add} ...但是如果另一個線程調用你的空檢查和你的Add ala某種形式的[雙重檢查](http://en.wikipedia.org/wiki/Double- checked_locking) – felickz

+0

@felickz:是的 - 這是一個很好的區別 - 如果您調用多個方法(如Contains,然後添加),並希望它們是原子,那麼你將不得不同步訪問。 –