我在 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 上执行锁定以使缓存是线程安全的最佳方法是什么?