将人们对垃圾收集的看法放在一边是否存在以下问题的死锁问题:
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);
}
答案 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()是一个阻止代码,因此在完成之前不会返回。所以我不确定你是通过锁定来实现的。