当前位置:首页 » 《随便一记》 » 正文

C# 线程安全的集合

17 人参与  2023年04月05日 13:29  分类 : 《随便一记》  评论

点击全文阅读


文章目录

BlockingCollectionConcurrentDictionaryConcurrentBagConcurrentStack

System.Collections.Concurrent

说明
BlockingCollection为实现 IProducerConsumerCollection 的线程安全集合提供阻塞和限制功能。
ConcurrentBag表示对象的线程安全的无序集合。
ConcurrentDictionary<TKey, TValue>表示可由多个线程同时访问的键值对的线程安全集合。
ConcurrentQueue表示线程安全的先进先出 (FIFO) 集合。
ConcurrentStack表示线程安全的后进先出 (LIFO) 集合。
OrderablePartitioner表示将一个可排序数据源拆分成多个分区的特定方式。
Partitioner提供针对数组、列表和可枚举项的常见分区策略。
Partitioner表示将一个数据源拆分成多个分区的特定方式。

BlockingCollection

一个支持界限和阻塞的容器

Add:向容器中插入元素
TryTake:从容器中取出元素并删除
TryPeek:从容器中取出元素,但不删除。
CompleteAdding:告诉容器,添加元素完成。此时如果还想继续添加会发生异常。
IsCompleted:告诉消费线程,生产者线程还在继续运行中,任务还未完成。

ConcurrentDictionary

对于读操作是完全无锁的,当很多线程要修改数据时,它会使用细粒度的锁。

AddOrUpdate:如果键不存在,方法会在容器中添加新的键和值,如果存在,则更新现有的键和值。
GetOrAdd:如果键不存在,方法会向容器中添加新的键和值,如果存在则返回现有的值,并不添加新值。
TryAdd:尝试在容器中添加新的键和值。
TryGetValue:尝试根据指定的键获得值。
TryRemove:尝试删除指定的键。
TryUpdate:有条件的更新当前键所对应的值。
GetEnumerator:返回一个能够遍历整个容器的枚举器。

ConcurrentBag

一个无序的集合,程序可以向其中插入元素,或删除元素。

在同一个线程中向集合插入,删除元素的效率很高。

Add:向集合中插入元素
TryTake:从集合中取出元素并删除
TryPeek:从集合中取出元素,但不删除该元素。

ConcurrentStack

其完全无锁,但当CAS面临资源竞争失败时可能会陷入自旋并重试操作。

Push:向栈顶插入元素
TryPop:从栈顶弹出元素,并且通过out 参数返回
TryPeek:返回栈顶元素,但不弹出

参考1
参考2


点击全文阅读


本文链接:http://zhangshiyu.com/post/58461.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1