如果有多个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. 上面的片段运行良好(未触发断言)。此外,问题实际上(至少)是两个独立的问题:
- 它们是否大约同时被清除(不是线程安全的)?
- 它们是否以线程安全的方式清除?
最佳答案
在您的问题中,weak1.IsAlive
始终等于 weak2.IsAlive
,因为 WeakReference.IsAlive获取当前 WeakReference 对象(或者说 WeakRefernce.Target)引用的对象是否已被垃圾回收的指示。这两个 WeakReference 具有相同的目标对象。但要注意 weak1/weak2 本身也是引用类型,它们不是引用相等的,但它们的目标是相同的。
关于c# - 对同一个对象的多个 WeakReferences 是否总是同步的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5064196/