為什么使用并發(fā)集合?

原因主要有以下幾點(diǎn):

  • System.Collections和System.Collections.Generic名稱(chēng)空間中所提供的經(jīng)典列表、集合和數(shù)組都不是線程安全的,若無(wú)同步機(jī)制,他們不適合于接受并發(fā)的指令來(lái)添加和刪除元素。

  • 在并發(fā)代碼中使用上述經(jīng)典集合需要復(fù)雜的同步管理,使用起來(lái)很不方便。

  • 使用復(fù)雜的同步機(jī)制會(huì)大大降低性能。

  • NET Framework 4所提供的新的集合盡可能地減少需要使用鎖的次數(shù)。這些新的集合通過(guò)使用比較并交換(compare-and-swap,CAS)指令和內(nèi)存屏障,避免使用互斥的重量級(jí)鎖。這對(duì)性能有保障。

注意:

與經(jīng)典集合相比,并發(fā)集合會(huì)有更大的開(kāi)銷(xiāo),因此在串行代碼中使用并發(fā)集合無(wú)意義,只會(huì)增加額外的開(kāi)銷(xiāo)且運(yùn)行速度比訪問(wèn)經(jīng)典集合慢。

 

2 并發(fā)集合

1)ConcurrentQueue:線程安全的先進(jìn)先出 (FIFO) 集合

主要方法:

  • Enqueue(T item);將對(duì)象添加到集合結(jié)尾。

  • TryDequeue(out T result); 嘗試移除并返回位于集合開(kāi)始處的對(duì)象,返回值表示操作是否成功。

  • TryPeek(out T result);嘗試返回集合開(kāi)始處的對(duì)象,但不將其移除,返回值表示操作是否成功。

說(shuō)明:

  • ConcurrentQueue是完全無(wú)鎖的,但當(dāng)CAS操作失敗且面臨資源爭(zhēng)用時(shí),它可能會(huì)自旋并且重試操作。

  • ConcurrentQueue是FIFO集合,某些和出入順序無(wú)關(guān)的場(chǎng)合,盡量不要用ConcurrentQueue。

 

2)ConcurrentStack:線程安全的后進(jìn)先出 (LIFO) 集合

網(wǎng)友評(píng)論