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

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

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

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

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

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

注意:

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

 

2 并發(fā)集合

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

主要方法:

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

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

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

說明:

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

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

 

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

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