我已经阅读了很多关于缓存和线程同步的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和字符串),并不真正大(百元素不多)。
所以,我不想锁定读取方法以避免同步开销,因为它在大多数情况下不是必需的,但是我希望在资源需要更新时使用它。
我的问题是:有没有办法做这样的事情:
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
方法?
编辑:
好了一些谷歌搜索后,我将有一个更准确的问题:是否有可能知道,如果一个类引用是被其它线程使用,如果是这样,等待此线程完成使用它?
我知道框架中有一个并发的词典,但我认为它锁定了读取的数据,这就是我想要避免的。我只需要将其锁定在更新上(这不会经常发生)。 – ppetrov 2013-03-29 10:46:22