System.Collections.Concurrent
为此,在.NET Framework中提供了System.Collections.Concurrent新的命名空间可以访问用于解决线程安全问题,通过这个命名空间能访问以下为并发做好了准备的集合。
1.BlockingCollection 与经典的阻塞队列数据结构类似,能够适用于多个任务添加和删除数据,提供阻塞和限界能力。
2.ConcurrentBag 提供对象的线程安全的无序集合
3.ConcurrentDictionary 提供可有多个线程同时访问的键值对的线程安全集合
4.ConcurrentQueue 提供线程安全的先进先出集合
5.ConcurrentStack 提供线程安全的后进先出集合
这些集合通过使用比较并交换和内存屏障等技术,避免使用典型的互斥重量级的锁,从而保证线程安全和性能。
ConcurrentQueue 是完全无锁的,能够支持并发的添加元素,先进先出。下面贴代码,详解见注释
class Program { static ConcurrentQueue<int> _queue = new ConcurrentQueue<int>(); static List<int> list = new List<int>(); static void Main(string[] args) { for (int i = 0; i < 1000; i++) { //写入 _queue.Enqueue(i); } for (int i = 0; i < 1000; i++) { Task.Factory.StartNew(Go); } Console.ReadLine(); } public static void Go() { int o; if(_queue.TryDequeue(out o)) { list.Add(o); Console.WriteLine(list.Count()); } } }