[英]Is it safe to add and remove items from a List object?
假设我们有多个线程和一个负责保存实时数据的公共List
。 我们有一些线程负责将数据添加到列表对象。 另一个线程负责从列表对象中获取数据,然后从顶部删除项目。
问题:从List
开头删除并同时在单独的线程中将数据添加到列表的末尾是否安全? List
对象是如何实现的?
从文档:
这种类型的公共静态成员是线程安全的。 不保证任何实例成员都是线程安全的。
对 List 执行多次读取操作是安全的,但如果在读取时修改集合,则可能会出现问题。
因此,如果您的集合可以被某些线程修改 - 您需要在写入和读取操作上锁定它。
文档还为您提供了另一种解决方案:
有关具有内置同步的集合,请参阅System.Collections.Concurrent命名空间中的类。
例如,像ConcurrentQueue 。 使用.Enqueue(obj)
将其插入到队列的末尾,并使用TryDequeue(out obj)
从队列的顶部获取它。
List 不是线程安全的。
您正在解决的问题看起来像是生产者-消费者问题,因此您需要的是一个实现IProducerConsumerCollection<T>
的集合:
System.Collections.Concurrent.ConcurrentBag<T>
System.Collections.Concurrent.ConcurrentQueue<T>
System.Collections.Concurrent.ConcurrentStack<T>
如果您还需要有界缓冲区(始终只允许集合中有一定数量的项目),您可以使用BlockingCollection<T>
,将上述任何一个作为内部集合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.