我正在使用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的项,这会引发竞争吗?
有一个“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;
}发布于 2011-09-16 22:50:46
您不应该使用The Caching Application Block进行自己的锁定,因为“您确信该块以线程安全的方式执行”。
如果查看一下Cache的源代码,就会发现Add、Remove和GetData方法都会在执行任何操作之前获取内存中缓存上的锁。
https://stackoverflow.com/questions/7441054
复制相似问题