C# 線程安全集合類

本文章僅爲個人理解,如有錯誤請指正。

從.Net 4.0框架開始,在System.Collections.Concurrent命名空間下,增加了用於多線程協同的併發集合類(線程安全集合)。

線程安全集合:

就是當多線程訪問時,採用了加鎖的機制;即當一個線程訪問集合時,會對這個集合進行保護,其他線程不能對其訪問,直到該線程操作完集合之後,其他線程纔可以使用。防止出現數據不一致或者數據被污染的情況。

只能保證集合的原子性、可見性,但是無法保證對集合操作的有序性,例如:多個線程同時將元素加入到集合,無法保證元素加入到集合的順序,多次運行情況結果會不同。

BlockingCollection<T>

提供具有阻塞和限制功能的線程安全集合,實現IProducerConsumerCollection<T>接口。支持容量大小的限制和完成添加限制,當標記爲完成添加後只允許移除(Take)操作,無法進行添加(Add)操作。

BoundedCapacity:獲取集合限定容量,在通過構造函數時可以指定集合的容量大小。

IsAddingCompleted:判斷是否已經標記完成添加,

IsCompleted:判斷是否標記完成添加並且爲空。

Add:將項添加到集合中。

CompleteAdding:將集合標記爲完成添加。調用該函數後IsAddingCompleted爲true,如果集合中包含的項數爲0,那麼IsCompleted也爲true。

Take:從集合中移除一項。

TryAdd:嘗試將項加入集合

TryTake:嘗試從集合中移除項。

ConcurrentBag<T>

提供可供多個線程同時安全訪問的無序包。對應非泛型列表List<T>。

包(Bag)和數據上的集(Set)的區別是包可包含重複元素,而集中不能包含重複元素。

Count:獲取無序包中的元素數量

IsEmpty:判斷無序包是否爲空。

TryPeek:從無序包中獲取一個元素,但不進行移除。

TryTask:從無序包獲取一個元素並移除。

ConcurrentDictionary<TKey,TValue>

提供可供多線程同時訪問的鍵值對的線程安全集合,對應Dictionary<TKey, TValue>。

IsEmpty:判斷字典是否爲空。

AddOrUpdate:將鍵值對添加到字典中,如果Key值已經存在,則更新Value值。

Clear:將所有鍵值對從字典中移除。

GetOrAdd:如果鍵不存在,則將鍵值對添加到字典中並返回Value值,如果鍵已經存在,則返回現有值,不會更新現有值。

TryUpdate:嘗試更新鍵對應的Value值。

ConcurrentQueue<T>

隊列,提供線程安全的先進先出(FIFO)集合,對應Queue<T>。

Enqueue:將對象添加到隊列末尾處。

TryDequeue:嘗試移除並返回位於隊列開頭處的對象。

TryPeek:嘗試返回隊列開頭處的對象但不將其移除。

ConcurrentStack<T>

棧,提供線程安全的後進先出(LIFO)集合,對應Stack<T>

Push:將對象插入棧頂部。

PushRange:將多個對象插入棧的頂部。

TryPeek:嘗試返回棧頂部的對象但不將其移除。

TryPop:嘗試彈出並返回棧頂部的對象。

TryPopRange:嘗試彈出並返回棧頂部的多個對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章