Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 锁对象内的垃圾收集_C#_Garbage Collection_Deadlock - Fatal编程技术网

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:谢谢你留下评论,而不仅仅是否决投票。如果上面的代码在用户线程上运行并获取锁,然后等待终结器运行。然后,如果终结器试图锁定同一个对象,它将阻塞,因为这已经被另一个线程持有。