读者的C#List <T>的线程安全性

ILI*_*DNO 12 c# list generic-list thread-safety

我打算在静态构造函数中创建一次列表,然后让该类的多个实例同时读取它(并通过它枚举)而不进行任何锁定.

在本文中, http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx MS描述了线程安全问题,如下所示:

此类型的公共静态(在Visual Basic中为Shared)成员是线程安全的.任何实例成员都不保证是线程安全的.

只要未修改集合,List就可以同时支持多个读取器.枚举通过集合本质上不是线程安全的过程.在枚举与一个或多个写访问争用的极少数情况下,确保线程安全的唯一方法是在整个枚举期间锁定集合.要允许多个线程访问集合以进行读写,您必须实现自己的同步.

"通过集合枚举本质上不是一个线程安全的过程." 声明让我担心.

这是否意味着它对于只有读者的场景是线程安全的,但只要您不使用枚举?

或者我的情况安全吗?


谢谢你的回答.为什么我需要使用AsReadOnly,如果它可以使用或不使用它?

SLa*_*aks 8

它们意味着如果你在不同的线程(或你自己的线程)改变它时枚举一个集合,你就会遇到问题.

只要您根本不更改集合,并且只要您不IEnumerator跨线程共享,就不应该有任何问题.

  • @EugeneBeresovksy:没错。 (2认同)

Hen*_*man 1

这是否意味着它对于仅读者场景来说是线程安全的,但只要您不使用枚举?或者对于我的场景来说安全吗?

完全取决于您何时写入集合。如果没有某种锁定方案,这与读取(枚举)是不可能一致的。

因此,如果您填充一次然后仅迭代它,那么您是安全的。但是,当一个线程更改列表(添加或删除项目)时,您将需要一个 ReaderWriterLockSlim。

当您更改存储项的状态时,线程安全性与该项(而不是列表)有关。