2012-01-06 66 views
3

我是SyncRoot概念的新手。據我所知,用於鎖定的對象應該是私有的。SyncRoot對象是否真的線程安全?

但是HashTable有一個公共屬性,SyncRoot,它只是一個私人SyncRoot對象的包裝。枚舉集合時,您鎖定HashTable.SyncRoot的是recommended

看起來我們可能因爲死鎖而失敗,因爲它不再是私人的。它真的是線程安全的嗎?

如果我使自己的私人鎖定機制呢? private readonly object _syncObject;

哪一個更好?爲什麼?

+0

你能告訴我任何可以使用它的場景嗎?因爲我覺得SyncRoot屬性只是一個包裝,因此是線程安全漏洞。 – 2012-01-06 12:21:20

回答

5

不,這不是.NET 1.x方法的真正問題。該物業是公開的,因爲它可公開訪問。枚舉集合的麻煩是。沒有辦法以線程安全的方式實現這一點,當你完成枚舉和解鎖時,沒有任何機制可以自動鎖定。 IEnumerable沒有Completed方法,不會繼承IDisposable。

所以允許代碼安全枚舉,您需要訪問鎖定對象。所以你可以用對該對象的鎖來包裝foreach語句。因此公共SyncRoot屬性。

然而,許多程序員陷入的最大熊陷阱是假設沒有必要。購買Synchronized屬性爲所有情況下都是線程安全的集合返回線程安全包裝的概念。事實並非如此。

5

ICollection.SyncRoot只在預通用集合上。它基本上已經過時了。

由於您提到的原因,這在泛型集合中被刪除 - 您應該使用自己的鎖定機制來控制對具有您需要的屬性(保持鎖定私人,避免死鎖...)的集合的訪問,比使用SyncRoot對象,然後假設你的代碼是神奇的線程安全的。

+0

kool ...感謝您澄清我的疑問。 – 2012-01-06 12:23:33

+0

@DJ如果它的權利標記爲正確... – RhysW 2012-05-10 07:43:28