版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。 本文鏈接:https://blog.csdn.net/kang_xuan/article/details/93979517 本文章僅為個人理解,如有錯誤請指正。 從.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:嘗試彈出並返回棧頂部的多個對象。 ———————————————— 版權聲明:本文為CSDN博主「玄之」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/kang_xuan/article/details/93979517