C#线程安全集合类说明(2): ConcurrentBag<T>
线程安全的集合所在的命名空间 using System.Collections.Concurrent;
Concurrent意思是并发的,并行的。反义是sequential(顺序的),线程安全的意思就是多线程中的同步锁(相当于增加了lock或Interlocked)
ConcurrentBag<T> 类
表示对象的线程安全的无序集合。相当于 System.Collections.Generic.List<T>在读写的时候增加lock
属性
Count |
获取 ConcurrentBag<T> 中包含的元素数。 |
IsEmpty |
获取一个值,该值指示 ConcurrentBag<T> 是否为空。 |
关键方法:
Add(T) |
将对象添加到 ConcurrentBag<T> 中。 |
ToArray() |
将 ConcurrentBag<T> 元素复制到新数组。 |
TryPeek(T) |
尝试从 ConcurrentBag<T> 返回一个对象但不移除该对象。 |
TryTake(T) |
尝试从 ConcurrentBag<T> 中移除和返回一个对象。 |
当排序并不重要时,包(Bag)可用于存储对象,而与集(HashSet)不同,包支持重复项。 ConcurrentBag<T> 是一个线程安全包实现,适用于同一线程将生成和使用存储在包中的数据的情况。
ConcurrentBag<T> 接受 null
作为引用类型的有效值。
参考微软官方文档:
https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.concurrent?view=netframework-4.5
参考源代码(类BlockingCollection<T>)
https://referencesource.microsoft.com/#System/sys/system/collections/concurrent/ConcurrentBag.cs,2b70243adbcbdb40
测试源程序:
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ThreadSafeCollectionDemo
{
class Program
{
static void Main(string[] args)
{
ConcurrentBag<string> bag = new ConcurrentBag<string>();
Console.WriteLine($"当前包的元素个数【{bag.Count}】,是否为空【{bag.IsEmpty}】");
Task task1 = Task.Run(() =>
{
bag.Add("北洛");
bag.Add("云无月");
});
Task task2 = Task.Run(() =>
{
bag.Add("岑缨");
bag.Add("姬轩辕");
});
Task.WaitAll(task1, task2);
//包Bag支持添加重复的元素,和List<T>一样都可以添加重复元素
bag.Add("岑缨");
Console.WriteLine($"当前包的元素个数【{bag.Count}】,是否为空【{bag.IsEmpty}】");
Action action = new Action(() =>
{
string element;
while (bag.TryTake(out element))
{
Console.WriteLine($"取出元素:【{element}】,当前线程编号:【{Thread.CurrentThread.ManagedThreadId}】");
}
});
//分成两部分取出
Parallel.Invoke(action, action);
string result;
if (bag.TryPeek(out result))
{
Console.WriteLine($"包存在元素:【{result}】");
}
else
{
Console.WriteLine("包当前没有元素");
}
Console.WriteLine($"当前包的元素个数【{bag.Count}】,是否为空【{bag.IsEmpty}】");
Console.ReadLine();
}
}
}
运行结果:
C#线程安全集合类说明(2): ConcurrentBag<T>相关推荐
- 第九章 - 线程安全集合类
第九章 - 线程安全集合类 线程安全集合类概述 线程安全集合类可以分为三大类: 遗留的线程安全集合如 Hashtable.Vector.线程安全的实现无非直接加synchronized 使用 Coll ...
- Java中的线程安全集合类
线程安全集合类 包括: StringBuffer: 线程安全 String: 不可变的类 , 都线程安全 Random: 线程安全 Vector: 实现了List,并且线程安全 Hashtable: ...
- .NET的ConcurrentDictionary,线程安全集合类
ConcurrentDictionary 是.NET 4.0里面新增的号称线程安全的集合类. 那么自然,我们会预期ConcurrentDictionary 中的代码是线程安全的(至少几个关键方法是线程 ...
- C# 线程安全集合类
本文章仅为个人理解,如有错误请指正. 从.Net 4.0框架开始,在System.Collections.Concurrent命名空间下,增加了用于多线程协同的并发集合类(线程安全集合). 线程安全集 ...
- 线程安全集合类- ConcurrentHashMap
文章目录 总结 jdk7 jdk8 JDK7和8对比 CHM是怎么保证线程安全的? 应用举例 CHM一定线程安全吗? 读下CHM1.7的源码 hash put 总结 get size rehash C ...
- java中常见的线程安全集合类
早在jdk的1.1版本中,所有的集合都是线程安全的.但是在1.2以及之后的版本中就出现了一些线程不安全的集合,为什么版本升级会出现一些线程不安全的集合呢?因为线程不安全的集合普遍比线程安全的集合效率高 ...
- 自定义Dictionary支持线程安全
本文转载:http://www.cnblogs.com/kiddo/archive/2008/09/25/1299089.html 我们说一个数据结构是线程安全指的是同一时间只有一个线程可以改写它.这 ...
- 多线程(6)线程同步
使用多线程很容易,但是如果多个线程同时访问一个共享资源时而不加以控制,就会导致数据损坏.所以多线程并发时,必须要考虑线程同步(或称线程安全)的问题. 什么是线程同步 多个线程同时访问共享资源时,使多 ...
- 【C#】线程安全的集合
System.Collections.Concurrent 命名空间 提供多个线程安全集合类,只要多个线程同时访问集合,就应使用这些类来代替System.Collections 和 System.Co ...
最新文章
- 网传京东某程序员因压力太大,在商品页面置入骂人代码!京东辟谣:不关我们的事,外部商家干的!...
- python读写mysql总结
- python3的float数精度_Python3 - 执行精确的浮点数运算
- mysql dms_关于MySQL与DMsql探寻
- request.params 用法
- pythonapi异步_Python-FastAPI异步博客开发记录--异步篇
- 数字公式识别的学习笔记
- 【C/C++】概念: VC虚函数布局引发的问题
- linux列出组_如何列出Linux中的所有组?
- SouthidcEditor编辑器如何支持上传png图片
- 音乐流媒体服务器Navidrome
- 微信网页支付之H5支付
- DCT变换的FPGA实现
- 等效于35mm相机焦距的计算方法
- SpringSecurity+jwt安全框架
- 性能测试面试题总结(答案全)
- 揭秘POS机套现江湖:代理商层层抽佣,支付机构“默许”?
- 神经网络入门书籍推荐,神经网络基础书籍
- 【转载】浅谈 flash 中的设计模式:模版
- 网站SEO优化是什么(概念解释与SEM的区别)
热门文章
- 将txt导入mysql_将Excel或txt导入Mysql(转载)
- 触摸屏登录的几种方式
- 基于海思Hi3531 ARM+K7 FPGA高性能综合视频图像处理平台
- 红帽Linux8.0 06管理本地用户和组
- 抽象方法能否同时是native或者static或synchronized的?
- 用HTML CSS 实现简洁美观的时间线(历史年表)
- Matic Network的应用场景大揭秘!
- (转)永磁同步电机(PMSM)的FOC闭环控制详解
- C#:实现计算a的b次方(附完整源码)
- vue-zhihu-daily知乎日报