我在SO和其他网站上已经阅读了很多关于缓存和线程同步的内容,但我仍然无法得到我的问题的答案。
.NET Thread Safety for Static Dictionary Cache
Why are locks performed on separate objects?
http://msdn.microsoft.com/en-us/magazine/cc188793.aspx
...
我正在尝试实现一个缓存,该缓存公开只从外部读取的资源。 这些资源可以更新,但不会经常发生,也不会花费太多时间。
基本上资源是键值列表(id和string),并不是很大(百元素不多)。
所以,我不想锁定read方法以避免同步开销,因为大部分时间都不需要,但我想在需要更新资源时使用它。
我的问题是:有没有办法做这样的事情:
public class AFTypeCache<T> where T : class
{
private Dictionary<int, T> _types;
private Func<Dictionary<int, T>> _dataProvider;
private readonly object _sync = new object();
public void UpdateData()
{
// here something (?) to make sure no more threads are reading the resource
lock (_sync)
{
_types = _dataProvider();
}
}
public IEnumerable<int, T> Get()
{
// thought about something like that but I'm pretty sure this won't work...
if (_updating)
{
lock
{
return _types;
}
}
else
{
// I know not the way to get enumerator but that's not the point
return _types;
}
}
}
此外,尝试实现这一点是否真的很有用,或者我是否采取了错误的方式并且应该在Get
方法中使用锁定?
修改
好了一些谷歌搜索后,我会有一个更准确的问题:是否有可能知道其他线程是否正在使用类引用,如果是,请等待这些线程完成使用它?
答案 0 :(得分:0)
我错过了什么或者您正在尝试创建并发字典?如果是这样,为什么不使用框架呢? (http://msdn.microsoft.com/en-us/library/dd287191.aspx)
你可以用并发字典(或你自己的版本)来解决你的问题,使用线程id和类名作为键,值是一个布尔值,表示类的用法在线程中。
但我看不出有任何理由这样做,并发框架中已经存在并发字典。