对同一个对象的多个WeakReferences是否始终同步?

时间:2011-02-21 09:23:53

标签: c# .net multithreading garbage-collection

如果有多个WeakReference指向同一个对象,它们是否会同时被清除,或者它们可能不同步。一个小例子来说明:

var o = new Object();
var weak1 = new WeakReference(o);
var weak2 = new WeakReference(o);

for (int i = 0; i < 10000; i++) {
    GC.Collect();
    Debug.Assert(weak1.IsAlive == weak2.IsAlive);
}

P.S。以上剪辑运行正常(断言未触发)。这些问题实际上(至少)是两个不同的问题:

  • 它们是否大约同时被清除(不是线程安全的)?
  • 是否以线程安全的方式清除它们?

1 个答案:

答案 0 :(得分:2)

在您的问题中,weak1.IsAlive始终等于weak2.IsAlive,因为WeakReference.IsAlive会指示当前WeakReference对象引用的对象(或者说WeakRefernce.Target)已被垃圾收集。两个WeakReference具有相同的目标对象。但要注意 weak1 / weak2 本身也是引用类型,它们不是引用相等,但它们的目标是相同的。