我在 SO 和其他网站上阅读了很多关于缓存和线程同步的内容,但我仍然无法回答我的问题。
http://msdn.microsoft.com/en-us/magazine/cc188793.aspx
...
我正在尝试实现一个缓存,该缓存公开只能从外部读取的资源。这些资源可以更新,但不会经常更新,也不会花费太多时间。
基本上,资源是键值列表(id 和字符串)并且不是很大(一百个元素不多)。
因此,我不想在 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
方法中使用锁?
编辑:
好的,经过更多的谷歌搜索,我会有一个更精确的问题:是否有可能知道其他线程是否正在使用类引用,如果是,请等待该线程完成使用它?