2012-01-17 105 views

回答

3

無論哪種方式將工作;不過,我更喜歡單獨的只讀,靜態對象進行同步。這樣它的目的就顯而易見,並且對於你正在執行的鎖類型而言是明顯的。

如果您爲了安全地使用字典或列表而進行鎖定,是否考慮過使用System.Generic.Collections.Concurrent對象?

另外,你有沒有考慮過ReaderWriterLock?這樣你可以允許多次讀取,但是可以安全地鎖定,一次只允許一次寫入。

更多信息

有沒有區別鎖定對一個單獨的對象與鎖定在字典本身。 CLR將創建或分配SyncBlock結構並管理鎖計數,而不考慮鎖定的對象。 http://msdn.microsoft.com/en-us/magazine/cc188793.aspx

我想什麼:

字典的職責是存儲數據,而不是同步線程有關,在這裏更多信息。使用一個單獨的用於同步的對象,將其標記爲專用只讀,並將其命名爲適當名稱,以便您知道該成員是用於鎖定的。

你和你的隊友不太可能會混淆關於誰鎖定什麼和什麼時候。如果字典是雙重任務,作爲同步對象和字典,那麼對於新的隊友來說,它可能不是明顯的鎖定,它在字典上,而且他們不應該創建新的同步對象。

新的隊友可能不知道字典引用作爲同步對象和字典具有雙重責任。該隊友可能會試圖在課程之外傳遞對字典的引用,以便以意想不到的方式鎖定,從而導致死鎖。一個單獨的同步對象可能會導致其他隊友停止並重新考慮傳遞其參考。

如果成員在調用鎖之前被標記爲只讀並初始化,那麼您大多保證該成員永遠不會爲空或換出另一個引用。

CLR中有些對象專門用於線程同步。在大多數情況下,SyncLock和Monitor.Enter都可以,但切換到ReaderWriterLock可以獲得更好的性能。您不僅可以允許多個線程同時讀取,而且可以安全地阻止所有線程以允許同步寫入。快速示例在這裏:http://www.codekicks.com/2008/03/readerwriterlock-cnet-systemthreading.html

+0

感謝您的回答,但我的問題實際上不是關於列表,但它是如果它保存以鎖定由類使用的私人靜態對象。 – 2012-01-17 04:54:44

+0

啊,我明白了。我用更多信息更新了我的答案。基本上,只要你完全知道什麼時候被鎖定,它是安全的。但有一個單獨的對象只是爲了鎖定更安全,因爲它的意圖是顯而易見的。 – 2012-01-17 06:23:22