

新闻资讯
技术学院ConcurrentBag是线程安全的无序集合,适合多线程下高效添加和取出元素,不保证顺序且允许重复,常用于生产者-消费者模式;ConcurrentDictionary是线程安全的键值对集合,通过细粒度锁或无锁机制提升并发读写性能,提供AddOrUpdate、GetOrAdd等原子操作,适用于高并发字典场景。
ConcurrentBag 和 ConcurrentDictionary 是 C# 中用于多线程环境下安全操作集合的类,它们属于 System.Collections.Concurrent 命名空间,专为高并发场景设计,无需额外加锁即可保证线程安全。
ConcurrentBag 适合在多个线程中频繁添加和取出元素的场景。它不保证顺序,每个线程有自己的本地队列以减少竞争,适合“生产者-消费者”模式中的临时数据存储。
特点:示例用法:
var bag = new ConcurrentBag(); Parallel.For(0, 1000, i => { bag.Add(i); }); while (bag.TryTake(out int item)) { Console.WriteLine(item); }
ConcurrentDictionary 是线程安全的键值对集合,适用于多线程读写字典的场景。它通过细粒度锁或无锁机制提升性能,避免了使用普通 Dictionary 加锁带来的性能瓶颈。
常用方法:示例用法:
var dict = new ConcurrentDictionary(); // 多个线程安全增加计数 Parallel.ForEach(items, item => { dict.AddOrUpdate(item, 1, (key, oldValue) => oldValue + 1); });
// 或使用 GetOrAdd 初始化 dict.GetOrAdd("key", k => ExpensiveCalculation());
直接使用 Concurrent 集合类是最推荐的方式。它们已经过优化,比手动加锁更高效且不易出错。
建议做法:
替代普通集合基本上就这些。用好 ConcurrentBag 和 ConcurrentDictionary,大多数线程安全集合问题都能高效解决。关键是理解它们的适用场景,避免误用导致性能下降或逻辑错误。