1 為什么使用并發(fā)集合?
原因主要有以下幾點(diǎn):
System.Collections和System.Collections.Generic名稱空間中所提供的經(jīng)典列表、集合和數(shù)組都不是線程安全的,若無同步機(jī)制,他們不適合于接受并發(fā)的指令來添加和刪除元素。
在并發(fā)代碼中使用上述經(jīng)典集合需要復(fù)雜的同步管理,使用起來很不方便。
使用復(fù)雜的同步機(jī)制會大大降低性能。
NET Framework 4所提供的新的集合盡可能地減少需要使用鎖的次數(shù)。這些新的集合通過使用比較并交換(compare-and-swap,CAS)指令和內(nèi)存屏障,避免使用互斥的重量級鎖。這對性能有保障。
注意:
與經(jīng)典集合相比,并發(fā)集合會有更大的開銷,因此在串行代碼中使用并發(fā)集合無意義,只會增加額外的開銷且運(yùn)行速度比訪問經(jīng)典集合慢。
2 并發(fā)集合
1)ConcurrentQueue:線程安全的先進(jìn)先出 (FIFO) 集合
主要方法:
Enqueue(T item);將對象添加到集合結(jié)尾。
TryDequeue(out T result); 嘗試移除并返回位于集合開始處的對象,返回值表示操作是否成功。
TryPeek(out T result);嘗試返回集合開始處的對象,但不將其移除,返回值表示操作是否成功。
說明:
ConcurrentQueue是完全無鎖的,但當(dāng)CAS操作失敗且面臨資源爭用時(shí),它可能會自旋并且重試操作。
ConcurrentQueue是FIFO集合,某些和出入順序無關(guān)的場合,盡量不要用ConcurrentQueue。
2)ConcurrentStack:線程安全的后進(jìn)先出 (LIFO) 集合
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26