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

原因主要有以下幾點:

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

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

  • 使用復雜的同步機制會大大降低性能。

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

注意:

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

 

2 并發(fā)集合

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

主要方法:

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

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

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

說明:

  • ConcurrentQueue是完全無鎖的,但當CAS操作失敗且面臨資源爭用時,它可能會自旋并且重試操作。

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

 

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

網(wǎng)友評論