.NET Framework 4 引入了 System.Collections.Concurrent 命名空间,其中包含多个线程安全且可缩放的集合类。
何时使用线程安全集合
.NET Framework 4 新引入了五个专为支持多线程添加和删除操作而设计的集合类型。 为了实现线程安全性,这些新类型使用多种高效的锁定和免锁定同步机制。
需要注意的是,Concurrent命名空间下的类保证线程安全,读写为最新值(不会脏读,不会死锁),并不代表逻辑业务上的线程安全,该用Lock还是要Lock。
参考资料
ConcurrentBag
ConcurrentBag是无序集合,不保证顺序
ConcurrentBag
var random = new Random();
var totalCount = 100;
ConcurrentBag<int> bag = new ConcurrentBag<int>();
Parallel.For(0, totalCount*10, item =>
{
if(bag.Count<= totalCount)
{
bag.Add(item);
}
});
//有时会超过100个
Console.WriteLine("ConcurrentBag's count is {0}", bag.Count());
int n = 0;
foreach (int i in bag)
{
if (n > 10)
break;
n++;
//输出结果随机,因为是并行的
Console.WriteLine("Item[{0}] = {1}", n, i);
}
Console.WriteLine("ConcurrentBag's max item is {0}", bag.Max());
结果
ConcurrentQueue
线程安全队列
ConcurrentQueue
ConcurrentStack
线程安全队列
ConcurrentStack
ConcurrentDictionary
线程安全字典
ConcurrentDictionary<TKey,TValue> 类