我正在C#中實現一個簡單的緩存,並試圖使其可以從多個線程訪問。在基本閱讀的情況下,很容易:鎖定自加載緩存
var cacheA = new Dictionary<int, MyObj>(); // Populated in constructor
public MyObj GetCachedObjA(int key)
{
return cacheA[key];
}
這是,我相信,完全是線程安全的。但我也想讓它自動加載。也就是說,如果緩存未在訪問時填充,則在滿足訪問請求之前將其填充。
Dictionary<int, MyObj> cacheB = null;
public MyObj GetCachedObjB(int key)
{
if (cacheB == null)
{
PopulateCacheB();
}
return cacheB[key];
}
private void PopulateCacheB()
{
cacheB = new Dictionary<int, MyObj>();
foreach (MyObj item in databaseAccessor)
{
cacheB.Add(item.Key, item);
}
}
這不是線程安全的,因爲cacheB實例化後,一個線程可以訪問GetCachedObjB但在此之前它是完全填充,如果另一個線程是填充它的過程。 那麼在cacheB上執行鎖定以便緩存是線程安全的最佳方式是什麼?
任何不使用「鎖定」語句而不是所有「嘗試...輸入...終於...退出」的東西的原因? http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx – LukeH 2009-06-30 17:09:59