2008-10-27 100 views
4

從MSDN文檔:爲什麼要使用Hashtable.Synchronized?

「同步支持多種文字線程,只要沒有線程正在閱讀的哈希表同步的包裝不提供一個或多個讀者和一個或多個作家的情況下,線程安全的訪問。 「。

來源: http://msdn.microsoft.com/en-us/library/system.collections.hashtable.synchronized.aspx

這聽起來像我還得反正使用鎖,所以我的問題是,我們爲什麼要使用Hashtable.Synchronized呢?

+0

在.NET中3.5和更好(我意識到這是一個老問題),這對多個讀者和作者是安全的。 – mhenry1384 2015-07-24 19:22:44

回答

3

出於同樣的原因,有不同級別的數據庫事務。您可能會關心寫入是否有保證,但不介意讀取陳舊/可能是不正確的數據。


編輯我注意到他們的具體例子是一個枚舉器。他們無法在包裝中處理這種情況,因爲如果你提前中斷枚舉,包裝類將無法知道它可以釋放它的鎖定。

想一想,而不是櫃檯的情況。多個線程可以增加表中的值,並且您希望顯示計數的值。如果您顯示1,200,453並且計數實際上是1,200,454,則無關緊要 - 您只需要關閉它即可。但是,您不希望數據被損壞。這是線程安全對於寫入而言非常重要的情況,但不是讀取。

+0

當你說「你不希望數據被破壞」時,如果數據被破壞,那該如何看?我認爲顯示錯誤的計數是腐敗的。 – hmak 2008-10-27 18:22:27

+1

如果Google說有1,200,453頁,因爲剛剛添加了1,200,454頁,並且在請求完成時持有計數的Hashtable條目正在更新,我不認爲這是一個問題。 GAE中的分片計數器的概念是基於這個原理的。 – 2008-10-27 18:36:55

1

對於您可以保證在寫入數據結構時(或不關心讀取錯誤數據時)沒有讀者訪問數據結構的情況。例如,結構不會一直在被修改,而是您稍後必須訪問的一次性計算,雖然它足夠大以保證許多線程都可以寫入它。

0

你需要它的時候,你是-eaching在一個線程在哈希表(讀取)和存在可以從它(寫入)添加/刪除項/其他線程...