假设我们有多个线程和一个公共List,该公共负责保存实时数据。我们有一些线程负责将数据添加到列表对象。另一个线程负责从列表对象获取数据,然后从顶部删除项目。
问题:从列表的开头删除并同时在单独的线程中将数据添加到列表的末尾是否安全? List对象是如何实现的?
从docs开始:
此类型的公共静态成员是线程安全的。任何实例成员都不保证是线程安全的。
对列表执行多次读取操作是安全的,但是如果在读取集合时对其进行了修改,则可能会发生问题。
因此,如果您的集合可以被某些线程修改-您需要在写入和读取操作时将其锁定lock。
文档还为您指出了另一种解决方案:
对于具有内置同步的集合,请参见System.Collections.Concurrent名称空间中的类。
例如,例如ConcurrentQueue。使用.Enqueue(obj)
将其插入队列的末尾,并使用TryDequeue(out obj)
将其从队列的顶部插入。