可以通过多个线程访问List <t>吗?

Beh*_*joo 10 c# multithreading thread-safety

我打算在多个线程之间共享一个List.该列表将在更改期间锁定,这种更改很少发生.如果同时通过列表从不同的线程进行多次迭代,是否存在线程安全问题?

And*_*are 12

如果可以(如果可以使用.NET 4),请使用BlockingCollection<T>:

为实现的线程安全集合提供阻塞和绑定功能IProducerConsumerCollection<T>.

如果没有,则完全封装列表并添加访问该List<T>'s状态的线程安全方法.不要将列表的引用设置为public或从任何方法返回它 - 始终封装引用,以便您可以保证锁定对它的所有访问.


Dar*_*rov 7

A List<T>不是一个线程安全的类,但是如果每次读/写时都锁定,就不会有任何问题.根据文件:

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

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


Har*_*ber 6

List<T>通常不是线程安全的。拥有多个阅读器不会导致任何问题,但是,您无法在读取列表时对其进行写入。因此,您需要锁定读取和写入或使用类似 a System.Threading.ReaderWriterLock(允许多个读取器但只允许一个写入器)之类的东西。

  • 几乎没有比“ReaderWriterLockSlim”更喜欢“ReaderWriterLock”的情况。`Slim` 版本性能更好,并具有更好的 API。 (4认同)