一:我们的集合是没有锁机制的
所以我们目前的集合都是线程不安全的
二:有哪些线程安全的集合
- ConcurrentQueue
==>Queue - ConcurrentDictionary<TKey, TValue> ==>Dictionary
- ConcurrentStack
==>Stack - ConcurrentBag
==>list Or LinkList
三:ConcurrentBag
ConcurrentBag 利用线程槽来分摊Bag中数据
ConcurrentBag 的数据放置咋i多个插入线程的槽位汇总。
底层是链表
ConcurrentBag<int> vs = new ConcurrentBag<int>();
vs.Add(1);
vs.Add(2);
Console.WriteLine(vs.Count);
for (int i = 0; i < vs.Count; i++)
{
var result = 0;
vs.TryTake(out result);
Console.WriteLine(result);
}
四:ConcurrentStack
线程安全的Stack是使用链表实现的,同步版本是用数组实现的
线程安全的Stack是使用Interloacked来实现线程安全,没使用内核锁
ConcurrentStack<int> vs = new ConcurrentStack<int>();
vs.Push(1);
vs.Push(2);
Console.WriteLine(vs.Count);
for (int i = 0; i < vs.Count; i++)
{
var result = 0;
vs.TryPop(out result);
Console.WriteLine(result);
}
五:ConcurrentQueue
使用单链表实现
1 | ConcurrentQueue<int> vs = new ConcurrentQueue<int>(); |
六:ConcurrentDictionary<TKey, TValue>
1 | ConcurrentDictionary<int, int> dic = new ConcurrentDictionary<int, int>(); |