2013-05-20 20 views
0

假設我有以下鎖定私人對象或哈希集本身?

HashSet<string> hsWaitingToBeFetched = new HashSet<string>(); 

我現在做的多線程編程的HashSet的,所以我必須以同步對象

我可以用這兩種方式鎖定這個鎖定此是否有任何性能差異?

private Object lockHashset = new Object(); 
lock(lockHashset) 
{ 
// do stuff here 
} 

lock(hsWaitingToBeFetched) 
{ 
// do stuff here 
} 
+0

如果您需要知道哪個更高性能,您應該考慮嘗試兩者並進行測量。請注意,從程序正確性角度而不是性能角度來看,選擇鎖定哪個對象更是一個問題。 – dlev

+1

散列設置是否爲私有?並且是否存在散列集*本身*發生變化的情況?也就是說,你是否改變了引用這個集合的變量的值,或者你只是改變集合的內容? –

回答

3

將不會有性能差異 ..語義差別將是如果某些其它代碼如果它暴露在HashSet的還鎖定。

我覺得是比較清楚在這樣的情況下,使用一個單獨的鎖對象:

  1. 更清晰的意圖 - 取決於場景
  2. 可以隱藏鎖對象(私有),但暴露的HashSet這應該沒有非常慎重考慮 - 鎖定(私人)更新(公共)HashSet沒有正確同步。
  3. 避免意外,如果對自身類型的鎖
  4. 可用,即使重新分配HashSet的成員

然而,因爲一個單獨的鎖對象確實在HashSet中沒有鎖,如果別的東西預計它確實..


新的鎖定對象的創建成本是可忽略的。對於上述兩種情況,CLR都以相同的方式進入顯示器。

+0

我不明白第二點。如果你公開哈希集合而不是鎖對象,那麼你公開的代碼如何安全地使用它? –

+0

@EricLippert感謝您的挑戰 - 我無法想出任何非複雜的使用案例,並已刪除該項目。 (我確信*當我寫這篇文章的時候我有一個很好的觀點,但是回想起來似乎被誤導了) – user2246674

+0

通常的情況下,你想同時暴露一個對象並且有一個與之關聯的鎖暗示在你的第三項:當邏輯上被鎖定的對象是類型'Type'時。 *不暴露類型可能非常困難,因此鎖定的對象應該是私有的,以確保只有類型內的代碼自己鎖定*。 –