锁对象内的垃圾收集

时间:2010-10-13 09:53:01

标签: c# garbage-collection deadlock

将人们对垃圾收集的看法放在一边是否存在以下问题的死锁问题:

private static readonly object lockObj = new object();
lock(lockObj )
{
           ///Load objects into a cache List<object> from DB call 
           GC.Collect(2);
           GC.WaitForPendingFinalizers();
           GC.Collect(2);
}

2 个答案:

答案 0 :(得分:2)

主要编辑,所以评论似乎不合适。抱歉给你带来不便。

很难确定。

假设代码看起来像这样

public class SomeType {
   private static readonly object Lock = new object();

   public void Foo() {
      lock (Lock) {
         Console.WriteLine("in foo");
         GC.Collect(2);
         GC.WaitForPendingFinalizers();
         GC.Collect(2);
      }
   }

   ~SomeType() {
      lock (Lock) {
         Console.WriteLine("in finalizer");
      }
   }
}

如果你有更多的SomeType实例,你可能会遇到死锁,因为它们都共享一个静态对象来锁定。您需要至少有一个无根和未收集的SomeType实例,并在另一个实例上调用Foo

现在,如果你没有上面的终结器,我看不出代码是如何死锁的。

答案 1 :(得分:0)

没有死锁的可能性。但为什么锁定这个?为什么第二个GC.Collect()?

GC.WaitForPendingFinalizers()是一个阻止代码,因此在完成之前不会返回。所以我不确定你是通过锁定来实现的。