2011-04-26 139 views
2

其實我正在研究一個應用程序,它使用多個線程來處理任務數量,父應用程序接收任務的輸出,後來被寫入文件,目前我使用arraylist來追加輸出,但是從隊列中移除項目時發生速度緩慢。 我想轉換arraylist部分鏈接列表優化讀取和清除,任何人都可以確認我們 如果linkedList .Net的實現是線程安全的,甚至使用arraylist是線程安全?是LinkedList實現.Net線程安全嗎?

+0

ArrayList的將是緩慢反正因爲裝箱/拆箱,你不能使用處理特定類型的集合嗎? – 2011-04-26 11:01:15

+0

我有成千上萬的記錄收到/秒,這意味着我必須有一點記憶意識:) – CodeWrite 2011-04-26 11:04:02

+0

如果列表存儲ValueTypes只會有拳擊。我沒有從Q中讀到。 – 2011-04-26 11:12:15

回答

6

reference指出:

這種類型不是線程安全的。如果需要通過多線程訪問 LinkedList(Of T),您需要 實現自己的同步 機制。

甲鏈表(OF T)可以支持 多個讀者同時,只要 作爲收集不被修改。 儘管如此,通過 集合列舉本質上不是線程安全的過程。在罕見的 情況下,枚舉與012寫入訪問競爭 ,集合 必須在整個枚舉過程中被鎖定。要允許 由多個線程訪問 讀取和寫入,您必須執行您自己的同步 。

編輯:

至於ArrayList中,該reference狀態:

公共靜態(在Visual Basic中的Shared)這種類型的 成員都是線程安全的。 任何實例成員不是 保證是線程安全的。

只要 集合沒有被修改,ArrayList可以同時支持多個 閱讀器。若要 保證ArrayList的線程安全,則必須通過 同步方法返回的包裝完成所有操作 。

枚舉整個集合是 本質上不是線程安全的 過程。即使集合是 同步,其他線程仍然可以 修改集合,這將導致枚舉器引發 引發異常。 要在枚舉中保證線程安全,您可以在整個 枚舉期間鎖定 集合,或者捕獲由其他 線程所做更改產生的異常 。

2

既然您已將它標記爲C#4,請使用BlockingCollection<T>

它是線程安全的,並且允許您在需要時節制流量。

這個集合類是爲這個任務設計的。但是,最終寫入文件時,集合的性能應該無關緊要。

0

命名空間System.Collections.Concurrent下的任何線程安全集合都應該爲您完成這項工作。然而,從性能的角度來看,我認爲這些性能不如Array好,因爲考慮到會有一些同步化開銷。你的兩個請求的線程safetiness和性能可能不是在同一時間achieveable,您可能需要達成某種折中點

如需更多信息,請參閱http://msdn.microsoft.com/en-us/library/dd267265.aspx

相關問題