7wp*_*7wp 1 c# multithreading locking
使用声明为类的字段而不是本地范围的锁定对象之间有区别吗?
例如:使用lockObject1或lockObject2以下示例之间是否有区别?
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)
似乎大多数示例似乎总是瞥见所选锁定对象的范围的重要性.
本地锁对象实际上不会提供任何线程安全性,因为运行FooBar的多个线程将各自拥有自己的对象,而不是共享单个对象进行锁定.(可悲的是,在我提出问题并及时纠正之前,我已经在编写代码的过程中看到了这个问题.)
如果要锁定对象的所有实例,则应始终使用私有静态成员变量。如果要锁定特定实例,请使用非静态私有成员。
永远不要使用公开可见的成员或“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)