我打算在靜態構造函數中創建一次列表,然後讓該類的多個實例同時讀取(並枚舉)它,而不進行任何鎖定。C#列表的線程安全<T>讀者
在這篇文章中 http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx MS介紹線程安全的問題如下:
公共靜態(在Visual Basic中的Shared)這種類型的 成員都是線程安全的。 任何實例成員不是 保證是線程安全的。
只要 集合未被修改,列表可同時支持多個閱讀器 。枚舉集合 本質上不是線程安全的 過程。在枚舉的 與一個或多個 寫入訪問競爭的罕見情況下,確保 線程安全的唯一方法是在整個枚舉中鎖定 集合。要允許 由多個線程訪問 讀取和寫入,您必須執行您自己的同步 。
The 「通過集合枚舉本質上不是線程安全的過程。」 聲明是我擔心的。
這是否意味着它是線程安全的讀者唯一的情況下,但只要你不使用枚舉?
或者對我的情況安全嗎?
感謝您的回答。 爲什麼我需要使用AsReadOnly,如果它可以使用或不使用它?
通過'不要共享IEnumerators跨線程'你的意思是'不從多個線程訪問**相同的枚舉器實例**? – 2014-07-08 07:25:32
@EugeneBeresovksy:的確如此。 – SLaks 2014-07-08 13:57:35