2012-03-20 32 views
0

我有一个关于锁的简单问题。 Process1和Process2是否相同,因为它们最终锁定了LongProcess? 谢谢。锁定相同功能的多个锁C#.Net

private static readonly object _Locker = new object(); 
public void Process1() 
{ 
    lock(_LockerA){ 
     LongProcess() 
    } 
} 

public void Process2() 
{ 
    if(curType == A) 
     ProcessTypeA(); 
    else if(curtype == B) 
     ProcessTypeB(); 
} 

private static readonly object _LockerA = new object(); 
public void ProcessTypeA() 
{  
    lock(_LockerA){ 
     LongProcess() 
    } 
} 

private static readonly object _LockerB = new object(); 
public void ProcessTypeB() 
{  
    lock(_LockerB){ 
     LongProcess() 
    } 
} 

public void LongProcess() 
{ 
} 

回答

0

不,它们是不一样的。如果锁定的对象不是已经存在的锁,则两个代码路径都将被允许。因此,在Process2curtype == 'b'的情况下,锁正在使用_LockerB对象。如果尝试使用_LockerA对象的其他锁之一,则它们将被允许进入LongProcess

+0

所以我可以说,进程2不同类型的将同时从不同的实例,但内处理一次只能处理同一种类型的数据。谢谢。 – Dreteh 2012-03-20 04:23:08

+0

我已经稍微更新了我的答案,将锁对象称为对象。它与类型无关,而不是用于对锁的实例。 – 2012-03-20 04:27:20

0

Process1Process2有可能锁定相同的对象,但它们肯定是不是相同。然而,在同一个调用堆栈内允许锁定同一个对象(我认为,很少甚至必须这样做)(在Process1调用Process2的情况下,也被称为递归锁定)。这可能会更好地描述为,依赖于锁定。

你的问题是相当然而,模糊的,所以你必须详细说明你的意思是相同什么...

+0

所以我可以说,对于process2不同的类型将从不同的实例并发处理,但在同一类型中,一次只能处理一个。谢谢。 – Dreteh 2012-03-20 04:21:34

+0

再次检查您的代码。对于_Process2_,'ProcessTypeA'和'ProcessTypeB'应该可以同时运行而不会产生锁定。 – 2012-03-20 04:27:22

+0

好的。谢谢。我只需要确保没有两个TypeA同时得到处理。 – Dreteh 2012-03-20 05:44:59