【问题标题】:.NET Garbage collector "race condition".NET 垃圾收集器“竞争条件”
【发布时间】:2012-03-10 00:17:12
【问题描述】:

给定以下使用 C# 的场景:

Someclass lInstance = new SomeClass();
System.WeakReference lWInstance = new System.WeakReference(lInstance);

lInstance = null;

System.GC.Collect();
System.GC.SuppressFinalize(lWInstance.Target);

想象一下,当 SuppressFinalize 执行时,GC 线程已经在 Someclass 的 Finalizer 代码中。

问题是会发生什么?我假设一旦 GC 线程进入 Finalizer 抑制它就没有效果了。

【问题讨论】:

  • 你尝试的时候发生了什么?我猜有时终结器会被执行,有时不会。
  • System.GC.Collect() 不能保证做任何事情。它可能只是安排一个集合。我的猜测是,一旦开始完成,除非有一些额外的检查,否则它不会停止。
  • 你为什么在乎? SuppressFinalize 应该是性能优化,仅此而已。

标签: c# .net garbage-collection


【解决方案1】:

如果lInstance 终结器正在执行,我希望lWInstance.Target 为空。 IE。 WeakReference 只会返回对有效的、未最终确定的目标的引用。

【讨论】:

  • +1。这是一个不可能的比赛条件。如果 SuppressFinalize 方法正在处理目标,则存在非弱引用 active -> ergo no finalization。
  • 这将是真的除非终结器重新公开引用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 2016-11-18
相关资源
最近更新 更多