我得到了这个单例缓存对象,它公开了一个 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
}
}