一. 四大并发集合类
背景:我们目前使用的所有集合都是线程不安全的 。
A. ConcurrentBag:就是利用线程槽来分摊Bag中的所有数据,链表的头插法,0代表移除最后一个插入的值.
(等价于同步中的List)
B. ConcurrentStack:线程安全的Stack是使用Interlocked来实现线程安全, 而没有使用内核锁.
(等价于同步中的数组)
C. ConcurrentQueue: 队列的模式,先进先出
(等价于同步中的队列)
D. ConcurrentDictionary: 字典的模式
(等价于同步中的字典)
以上四种安全的并发集合类,也可以采用同步版本+Lock锁(或其它锁)来实现
代码实践:
01-ConcurrentBag
{
Console.WriteLine("---------------- 01-ConcurrentBag ---------------------");
ConcurrentBag<int> bag = new ConcurrentBag<int>();
bag.Add(1);
bag.Add(2);
bag.Add(33);
//链表的头插法,0代表移除最后一个插入的值
var result = 0;
//flag为true,表示移除成功,并且返回被移除的值
var flag = bag.TryTake(out result);
Console.WriteLine("移除的值为:{0}", result);
}
#endregion
02-ConcurrentStack
{
Console.WriteLine("---------------- 02-ConcurrentStack ---------------------");
ConcurrentStack<int> stack = new ConcurrentStack<int>();
stack.Push(1);
stack.Push(2);
stack.Push(33);
//链表的头插法,0代表移除最后一个插入的值
var result = 0;
//flag为true,表示移除成功,并且返回被移除的值
var flag = stack.TryPop(out result);
Console.WriteLine("移除的值为:{0}", result);
}
#endregion
03-ConcurrentQueue
{
Console.WriteLine("---------------- 03-ConcurrentQueue ---------------------");
ConcurrentQueue<int> queue = new ConcurrentQueue<int>();
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(33);
//队列的模式,先进先出,0代表第一个插入的值
var result = 0;
//flag为true,表示移除成功,并且返回被移除的值
var flag = queue.TryDequeue(out result);