如果有多个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。以上剪辑运行正常(断言未触发)。这些问题实际上(至少)是两个不同的问题:
答案 0 :(得分:2)
在您的问题中,weak1.IsAlive
始终等于weak2.IsAlive
,因为WeakReference.IsAlive会指示当前WeakReference对象引用的对象(或者说WeakRefernce.Target)已被垃圾收集。两个WeakReference具有相同的目标对象。但要注意 weak1 / weak2 本身也是引用类型,它们不是引用相等,但它们的目标是相同的。