c# - 对同一个对象的多个 WeakReferences 是否总是同步的?

标签 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. 上面的片段运行良好(未触发断言)。此外,问题实际上(至少)是两个独立的问题:

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

最佳答案

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

关于c# - 对同一个对象的多个 WeakReferences 是否总是同步的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5064196/

相关文章:

C#:如何将 winforms 按钮的文本绑定(bind)到资源

.net - 我可以将可移植类库中的类或方法限制为特定平台吗?

c# - 是否可以在简单注入(inject)器的方法中使用线程范围的生活方式

java - 使用 Java,这种类型的设置和方法调用线程安全吗?

c# - 确保对象不变?

c# - nhibernate 2本书

C# 从集合类访问对象的属性

.net - 如何判断DataRow中是否存在某列?

c# - 将鼠标直接放在 Silverlight 中的元素上

c# - 多线程设计模式