2011-12-27 38 views
5

更好的是:
有在锁声明大码区

有大面积的小锁..在此示例中
交往是不是多变? 。什么是锁码区的正确方法

lock (padLock) 
{ 
    foreach (string ex in exchanges) 
    { 
    sub.Add(x.ID, new Subscription(ch, queue.QueueName, true)); 
......... 
} 

foreach (string ex in exchanges) 
{ 
    lock (padLock) 
    { 
    sub.Add(x.ID, new Subscription(ch, queue.QueueName, true)); 
    } 
..... 
+2

它完全取决于你锁定的内容。 – SLaks 2011-12-27 13:38:47

+0

@SLaks,我想我不完全明白什么时候使用锁定然后.. :( – 0x49D1 2011-12-27 13:39:49

+1

你的例子没有完成,所以在问题的范围内没有意义,因为在循环中不使用'ex'和'很难建议你具体的东西 – sll 2011-12-27 13:41:10

回答

1

锁越宽 - 从多线程获得的越少,反之亦然 因此,锁的使用完全取决于逻辑。仅锁定的东西和地方哪些变化,有如果锁定了使用收集sub只能由一个线程在一个时间

运行 - 用小锁,但如果您运行并行

1

良好的做法是,如果该区域是整个foreach循环,然后只锁定要被只有一个线程在给定时间

执行的区域第一种方法是罚款

但如果该地区只是一条线,因为你已经表明我第二种方法,然后去第二种方法

0

不能有效地判断哪一个是“正确”与给定的代码片段。第一个例子说,人们只能看到来自交易所的部分内容,并不好。第二个例子表示,人们只能看到来自交易所的部分内容,这是可以的。

1

我觉得有两个不同的问题:
1.哪一个是正确的?
2.哪个可以提高性能?

正确性问题很复杂。这取决于你的数据结构,以及你打算如何保护它们。如果“子”对象不是线程安全的,那么你肯定需要大锁。

性能问题更简单,也更不重要(但由于某种原因,我认为你更关注它)。
许多小锁可能会更慢,因为他们只是做更多的工作。但是如果你设法在没有锁的情况下运行大部分循环代码,你会得到一些并发性,所以它会更好。

+0

谢谢你的好解释。我把带有非线程安全集合的循环放入锁中,以完成一些包含集合修改的代码块。对于我来说,在这个大型锁定语句中,糟糕的是该块还包含来自同一类并使用相同同步对象的一些方法。所以,我认为,有时会导致运行程序中出现死锁(或者只是不需要锁定):(现在所有的修改程序都更具响应性。 – 0x49D1 2011-12-27 14:47:05

相关问题