我得到了这个síngleton缓存对象,它公开了一个IEnumerable属性,它只返回一个私有的IEnumerable变量。更新对使用中的成员变量的引用
我在我的单例对象上有一个静态方法,用于更新此成员变量(存在于此缓存对象的单个“实例”实例上)。
假设一些线程正在迭代此IEnumerable变量/属性,而我的缓存正在更新。我做到了,缓存在一个新的本地变量上更新,最后设置暴露的私有变量指向这个新的局部变量。
我知道我只是更新一个引用,留下其他(旧)对象在内存中等待被GC拾起,但我的问题是 - 我不是100%确定会发生什么事,一旦我设置新参考?其他线程是否会突然迭代新对象或旧对象通过IEnumerable接口?如果这是一个正常的参考,我会说'不'。调用线程将在旧对象上运行,但我不确定IEnumerable是否也是这种情况?
这里是一流的精简:
internal sealed class SektionCache : CacheBase
{
public static readonly SektionCache Instance = new SektionCache();
private static readonly object lockObject = new object();
private static bool isUpdating;
private IEnumerable<Sektion> sektioner;
static SektionCache()
{
UpdateCache();
}
public IEnumerable<Sektion> Sektioner
{
get { return sektioner; }
}
public static void UpdateCache()
{
// SNIP - getting data, locking etc.
Instance.sektioner = newSektioner;
// SNIP
}
}
它正在枚举的实例不需要是新的(和易失性关键字)?我的意思是我让它IEnumerable所以它不能改变任何东西,或者我在这里错过了什么? – 2008-09-22 10:49:30