.NET 4.0并发集合库中ConcurrentBag<T>
类的MSDN文档说明了这一点:
ConcurrentBag是一个线程安全的包 实施,优化 相同线程的场景 同时生产和消费数据 存放在包中。 [强调我的]
我是否遗漏了某些内容,或者这是说ConcurrentBag<T>
类针对单线程方案进行了优化?
如果我不错过了什么......为什么会这样?有一个集合设计用于并发,但优化用于一个线程,这似乎很奇怪。
答案 0 :(得分:1)
文档试图说的是它更喜欢生成和使用数据的相同线程。
它有一个快速路径,当同一个线程生成并使用数据时,数据保留在该线程上(想想[ThreadStatic]
)。但是,当在同一个线程上没有要使用的数据时,它会查看其他线程并从那里获取数据。
看看,例如在http://www.codethinked.com/post/2010/01/27/NET-40-and-System_Collections_Concurrent_ConcurrentBag.aspx获得更详细的解释。
答案 1 :(得分:1)
优化意味着,如果你有多个生产和消费的线程,那么就有优化,如果它可以返回由同一个线程放在包中的项目,那么它是最快的。
这种优化不适用的地方是,如果一个线程要求袋子找到一个物品,那么该口袋中没有剩下的物品放在那里。在这种情况下,它仍然可以从包中检索一个项目(由另一个线程放在那里),但它不太理想。
或者,换句话说:它是并发的,因为多个线程可以生成并同时从中消耗,无需外部锁定。提到的优化不会使这不真实。
答案 2 :(得分:1)
您可以使用ConcurrentBag
的三种情况以及此优化如何影响它们:
1)单独的生产者和消费者线程。没效果。
2)作为消费者和生产者的线程存储和检索来自ConcurrentBag
的数据。优化将提高相同线程添加/检索操作的性能。
3)可以使用常规集合的单线程场景。优化意味着使用ConcurrentBag
的开销很小,因此您可以使用它而不会产生巨大的性能损失。