C 執行緒安全集合類

2022-02-21 19:07:56 字數 1680 閱讀 9593

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

從.net

4.0框架開始,在system.collections.concurrent命名空間下,增加了用於多執行緒協同的併發集合類(執行緒安全集合)。

執行緒安全集合:

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

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

blockingcollection

提供具有阻塞和限制功能的執行緒安全集合,實現iproducerconsumercollection

介面。支援容量大小的限制和完成新增限制,當標記為完成新增後只允許移除(take)操作,無法進行新增(add)操作。

boundedcapacity:獲取集合限定容量,在通過建構函式時可以指定集合的容量大小。

isaddingcompleted:判斷是否已經標記完成新增,

iscompleted:判斷是否標記完成新增並且為空。

add:將項新增到集合中。

completeadding:將集合標記為完成新增。呼叫該函式後isaddingcompleted為true,如果集合中包含的項數為0,那麼iscompleted也為true。

take:從集合中移除一項。

tryadd:嘗試將項加入集合

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

concurrentbag

提供可供多個執行緒同時安全訪問的無序包。對應非泛型列表list

。包(bag)和資料上的集(set)的區別是包可包含重複元素,而集中不能包含重複元素。

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

isempty:判斷無序包是否為空。

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

trytask:從無序包獲取乙個元素並移除。

concurrentdictionary

提供可供多執行緒同時訪問的鍵值對的執行緒安全集合,對應dictionary

。isempty:判斷字典是否為空。

addorupdate:將鍵值對新增到字典中,如果key值已經存在,則更新value值。

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

getoradd:如果鍵不存在,則將鍵值對新增到字典中並返回value值,如果鍵已經存在,則返回現有值,不會更新現有值。

tryupdate:嘗試更新鍵對應的value值。

concurrentqueue

佇列,提供執行緒安全的先進先出(fifo)集合,對應queue

。enqueue:將物件新增到佇列末尾處。

trydequeue:嘗試移除並返回位於佇列開頭處的物件。

trypeek:嘗試返回佇列開頭處的物件但不將其移除。

concurrentstack

棧,提供執行緒安全的後進先出(lifo)集合,對應stack

push:將物件插入棧頂部。

pushrange:將多個物件插入棧的頂部。

trypeek:嘗試返回棧頂部的物件但不將其移除。

trypop:嘗試彈出並返回棧頂部的物件。

trypoprange:嘗試彈出並返回棧頂部的多個物件。

————————————————

執行緒安全集合

1.包裝執行緒不安全集合成執行緒安全集合 使用collections方法實現,需要封裝的物件建立出來要立即封裝 封裝執行緒安全的hashmap hashmap map collections.synchronizedmap new hashmap 此外還提供了 synchronizedcollect...

12 5 執行緒的安全集合

阻塞佇列方法方法 正常動作 特殊情況下動作 add新增乙個元素 如果佇列滿,則丟擲illegalstateexception異常 element 返回隊頭元素 如果隊列為空,則丟擲nosuchelementexception異常 offer 新增乙個元素並返回true 如果佇列滿則返回false p...

c 集合類的執行緒安全

即位於system.collections命名空間下的集合,如hashtable,arraylist,stack,queue等.其均提供了執行緒同步的乙個實現 與預期結果不同 每種資料型別都包含乙個靜態的synchronized方法,如 arraylist list arraylist.synchr...