【C#】线程安全的集合

System.Collections.Concurrent 命名空间

提供多个线程安全集合类,只要多个线程同时访问集合,就应使用这些类来代替System.Collections System.Collections.Generic 命名空间中的相应类型。 但是,不保证通过扩展方法或通过显式接口实现访问集合对象是线程安全的,可能需要由调用方进行同步。

说明
BlockingCollection<T>为实现 IProducerConsumerCollection<T> 的线程安全集合提供阻塞和限制功能。
ConcurrentBag<T>表示对象的线程安全的无序集合。
ConcurrentDictionary<TKey, TValue>表示可由多个线程同时访问的键值对的线程安全集合。
ConcurrentQueue<T>表示线程安全的先进先出 (FIFO) 集合。
ConcurrentStack<T>表示线程安全的后进先出 (LIFO) 集合。
OrderablePartitioner<TSource>表示将一个可排序数据源拆分成多个分区的特定方式。
Partitioner提供针对数组、列表和可枚举项的常见分区策略。
Partitioner<TSource>表示将一个数据源拆分成多个分区的特定方式。

接口

接口说明
IProducerConsumerCollection定义供制造者/使用者用来操作线程安全集合的方法。 此接口提供一个统一的表示(为生产者/消费者集合),从而更高级别抽象如 BlockingCollection 可以使用集合作为基础的存储机制。

枚举

枚举说明
EnumerablePartitionerOptions指定控制分区程序的缓冲行为的选项。
### C#线程安全集合类型及其用法 C# 提供了一系列专门设计用于多线程环境下的集合类,这些集合类位于 `System.Collections.Concurrent` 命名空间下。它们通过内部机制确保多个线程可以同时访问而不会引发数据竞争或其他同步问题。 #### 1. **ConcurrentDictionary<TKey, TValue>** `ConcurrentDictionary<TKey, TValue>` 是一种线程安全的字典实现,支持高效的并发读写操作。它允许在一个线程上执行写入的同时,在其他线程上进行读取或写入操作。其主要特性包括原子性的添加、更新和移除操作[^1]。 以下是它的基本用法: ```csharp using System; using System.Collections.Concurrent; class Program { static void Main() { var concurrentDict = new ConcurrentDictionary<int, string>(); // 添加键值对 concurrentDict.TryAdd(1, "Value1"); // 更新现有项 concurrentDict.AddOrUpdate(1, "NewValue", (key, oldValue) => "UpdatedValue"); // 获取值 if (concurrentDict.TryGetValue(1, out string value)) Console.WriteLine(value); // 删除键值对 concurrentDict.TryRemove(1, out _); } } ``` --- #### 2. **ConcurrentBag<T>** `ConcurrentBag<T>` 表示一个线程安全的无序集合,适用于不需要维护顺序的情况。它可以高效地处理大量并发添加和获取的操作[^3]。 下面是一个简单的例子: ```csharp using System; using System.Collections.Concurrent; using System.Threading.Tasks; class Program { static void Main() { var bag = new ConcurrentBag<int>(); Task.Factory.StartNew(() => { for (int i = 0; i < 100; i++) bag.Add(i); }); while (!bag.IsEmpty) { if (bag.TryTake(out int item)) Console.WriteLine(item); } Console.ReadLine(); } } ``` --- #### 3. **ConcurrentQueue<T>** `ConcurrentQueue<T>` 实现了一个线程安全的队列(先进先出 FIFO)。适合于生产者-消费者模式中的场景[^4]。 代码示例如下: ```csharp using System; using System.Collections.Concurrent; class Program { static void Main() { var queue = new ConcurrentQueue<int>(); for (int i = 0; i < 5; i++) queue.Enqueue(i); while (queue.TryDequeue(out int number)) Console.WriteLine(number); } } ``` --- #### 4. **ConcurrentStack<T>** `ConcurrentStack<T>` 是一个多线程友好的栈(后进先出 LIFO),同样适用于高并发环境下需要快速压栈和弹栈的应用场景[^4]。 使用方式如下: ```csharp using System; using System.Collections.Concurrent; class Program { static void Main() { var stack = new ConcurrentStack<int>(); for (int i = 0; i < 5; i++) stack.Push(i); while (stack.TryPop(out int number)) Console.WriteLine(number); } } ``` --- #### 总结 以上介绍了几种常见的线程安全集合类型以及它们的基本用法。每种类型的适用场景不同,开发者应根据实际需求选择合适的集合来优化性能并减少潜在的竞争条件[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值