我正在使用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;
}
}
我担心的是,如果一个线程即将同时更新特定键的项目,因为另一个线程即将读取相同键的项目。这可能导致比赛吗?
为“ReaderWriterLockSlim”设置一个“键”字典是否有意义,这样你基本上只能锁定一个特定的键,而不是像Web应用程序这样的多线程场景中的“常用”锁:
基本上是这样的:
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;
}
答案 0 :(得分:3)
您不应该使用The Caching Application Block进行自己的锁定,因为“您确信该块以线程安全的方式执行”。
如果您查看Cache
的源代码,您会看到Add
,Remove
和GetData
方法都获取内存中的锁定在执行任何操作之前缓存。