C# 锁对象内的垃圾收集
抛开人们对垃圾收集的看法不谈,以下方面是否存在任何僵局问题:C# 锁对象内的垃圾收集,c#,garbage-collection,deadlock,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();
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);
}
private static readonly object lockObj=new object();
锁(lockObj)
{
///从DB调用将对象加载到缓存列表中
GC.Collect(2);
GC.WaitForPendingFinalizers();
GC.Collect(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
现在,如果没有上面提到的终结器,我看不出代码是如何死锁的 没有死锁的可能性。但为什么要锁定这个?为什么要使用第二个GC.Collect()
WaitForPendingFinalizers()是一个阻止代码,因此在完成之前不会返回。因此,我不确定通过锁定实现了什么。为什么要这样做?无论如何,不要调用GC.Collect()。。。99/100您这样做的理由是错误的谢谢,但就像我说的,把人们关于显式调用GC.Collect的观点或事实放在一边……锁定代码也特别没有意义。你想在这里达到什么效果?(毫无意义,因为这段代码的两个调用者将锁定两个不同的对象)@jquery auth:这不是意见。如果您认为需要调用GC.Collect(),那么您的代码几乎肯定还有其他问题。@Damien:这是一个静态代码。Poster简化了代码我编辑了代码片段,实际上我并没有锁定“this”,它只是为了使示例尽可能小而添加的possible@Aliostad:谢谢你留下评论,而不仅仅是否决投票。如果上面的代码在用户线程上运行并获取锁,然后等待终结器运行。然后,如果终结器试图锁定同一个对象,它将阻塞,因为这已经被另一个线程持有。