C#线程锁定并使用锁定对象; 锁定对象的正确范围应该是什么?

7wp*_*7wp 1 c# multithreading locking

使用声明为类的字段而不是本地范围的锁定对象之间有区别吗?

例如:使用lockObject1lockObject2以下示例之间是否有区别?

public class Test()
{
   private Object lockObject1 = new Object();

   public void FooBar()
   {
       lock(lockObject1)
       {
          //Thread safe area 1
       }

       var lockObject2 = new Object();
       lock(lockObject2)
       {
           //Thread safe area 2
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

似乎大多数示例似乎总是瞥见所选锁定对象的范围的重要性.

Doc*_*Max 8

本地锁对象实际上不会提供任何线程安全性,因为运行FooBar的多个线程将各自拥有自己的对象,而不是共享单个对象进行锁定.(可悲的是,在我提出问题并及时纠正之前,我已经在编写代码的过程中看到了这个问题.)

  • 对,那是正确的.使用非静态在实例和静态中提供线程安全性,以在多个实例之间提供线程安全性. (5认同)

ant*_*awn 5

如果要锁定对象的所有实例,则应始终使用私有静态成员变量。如果要锁定特定实例,请使用非静态私有成员。

永远不要使用公开可见的成员或“this”,因为您永远不知道其他人何时会将其用于自己的锁,并可能导致死锁。

public class Test()
{
   private static Object lockObjectAll = new Object();
   private Object lockObjectInstance = new Object();

   public void FooBar()
   {
       lock (lockObjectAll)
       {
          // Thread safe for all instances
       }

       lock (lockObjectInstance)
       {
          // Thread safe for 'this' instance
       }
   }
}
Run Code Online (Sandbox Code Playgroud)