2011-12-27 37 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

相關問題