https://www.mgenware.com/blog/?p=232

ConcurrentBag<T>对于同一个线程值的添加和删除是非常快的,因为ConcurrentBag内部将数据按线程的标识而独立存储,所以一个线程从自己的数据中移除一个数据是非常快的,当然如果这个线程中没有数据,那么只能从其他线程中移除数据,此时会发生一些性能损耗从而确保线程安全!

比如从线程1中加入两个数据,在线程2中加入一个数据。那么当线程2调用TryTake时,被移除的数据肯定是线程2加入的那个数据:

//+ using System.Threading.Tasks;
//+ using System.Collections.Concurrent; var bag = new ConcurrentBag<string>(); var t1 = Task.Factory.StartNew(() =>
{
bag.Add("线程1: 1");
Thread.Sleep();
bag.Add("线程1: 2"); foreach (var str in bag)
Console.WriteLine(str);
}); var t2 = Task.Factory.StartNew(() =>
{
bag.Add("线程2: 1");
Thread.Sleep(); string str;
bag.TryTake(out str);
Console.WriteLine("线程2取出:" + str);
}); Task.WaitAll(t1, t2); 输出: 线程1:
线程1:
线程2:
线程2取出:线程2: 如果在线程2(代码中的t2 Task)去掉往ConcurrentBag中添加数据的代码,那么ConcurrentBag将会从线程1的数据中删除一项元素。示例输出: 线程1:
线程1:
线程2取出:线程1:

ConcurrentBag<T>对于同一个线程值的添加和删除是非常快的,因为ConcurrentBag内部将数据按线程的标识而独立存储,所以一个线程从自己的数据中移除一个数据是非常快的,当然如果这个线程中没有数据,那么只能从其他线程中移除数据,此时会发生一些性能损耗从而确保线程安全!

比如从线程1中加入两个数据,在线程2中加入一个数据。那么当线程2调用TryTake时,被移除的数据肯定是线程2加入的那个数据:

//+ using System.Threading.Tasks;
//+ using System.Collections.Concurrent; var bag =newConcurrentBag<string>(); var t1 =Task.Factory.StartNew(() =>
{
bag.Add("线程1: 1");
Thread.Sleep(1000);
bag.Add("线程1: 2"); foreach (var str in bag)
Console.WriteLine(str);
}); var t2 =Task.Factory.StartNew(() =>
{
bag.Add("线程2: 1");
Thread.Sleep(2000); string str;
bag.TryTake(out str);
Console.WriteLine("线程2取出:"+ str);
}); Task.WaitAll(t1, t2);

输出:

线程1: 2
线程1: 1
线程2: 1
线程2取出:线程2: 1

如果在线程2(代码中的t2 Task)去掉往ConcurrentBag中添加数据的代码,那么ConcurrentBag将会从线程1的数据中删除一项元素。示例输出:

线程1: 2
线程1: 1
线程2取出:线程1: 1

ConcurrentBag同线程元素的添加和删除的更多相关文章

  1. JS数组方法汇总 array数组元素的添加和删除

    js数组元素的添加和删除一直比较迷惑,今天终于找到详细说明的资料了,先给个我测试的代码^-^ var arr = new Array(); arr[0] = "aaa"; arr[ ...

  2. javascript数组元素的添加、删除与插入以及参数数组的使用

    1.数组元素的添加 push方法在数组的尾部添加元素: var colorArray=new Array(); colorArray.push('red','black','yellow'); //这 ...

  3. JS 数组方法 array数组声明 元素的添加和删除 等

    声明数组 var arr1 = [1,2,3,4,5]; var arr2 = new Array(100); //声明长度为100的arr2数组. arr2=[]; arr2.length = 10 ...

  4. js中数组元素的添加和删除

    js中数组元素常用添加方法是直接添加.push方法以及unshift方法 删除方法则是delete.pop.shift 集修改方法为一身的则是splice 1.添加: (1)直接添加通常都是这样 va ...

  5. js数组元素的添加和删除

    简单测试例子: var arr = new Array(); arr[0] = "aaa"; arr[1] = "bbb"; arr[2] = "cc ...

  6. angular.element 动态添加和删除元素

    addClass()-为每个匹配的元素添加指定的样式类名after()-在匹配元素集合中的每个元素后面插入参数所指定的内容,作为其兄弟节点append()-在每个匹配元素里面的末尾处插入参数内容att ...

  7. Winform中对自定义xml配置文件进行Xml节点的添加与删除

    场景 Winform中自定义xml配置文件后对节点进行读取与写入: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10053213 ...

  8. js数值的添加与删除

    js中数组元素的添加和删除 js中数组元素常用添加方法是直接添加.push方法以及unshift方法 删除方法则是delete.pop.shift 集修改方法为一身的则是splice 1.添加: (1 ...

  9. 添加和删除节点(HTML 元素)。

    JavaScript HTML DOM 元素(节点)   添加和删除节点(HTML 元素). 创建新的 HTML 元素 如需向 HTML DOM 添加新元素,您必须首先创建该元素(元素节点),然后向一 ...

随机推荐

  1. ThreadPoolExecutor(线程池)源码分析

    1. 常量和变量 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); // 高3位为线程池的运行状态,低29 ...

  2. [转][Navicat for MySQL系列]Navicat如何使用(二)

    上一篇经验已经建立了数据连接,这篇我介绍一下Navicat for MySQL的“增删改查”功能是如何操作的. 工具/原料 Navicat for MySQL 10.1.7 数据库操作(基本) 1 远 ...

  3. 使用CURL抓取淘宝页面

    /** * 根据地址抓取淘宝页面html代码 * @param type $url 地址 * @return boolean */ public function getTaoBaoHtml($url ...

  4. Linux下Git命令中文显示乱码的问题解决:274\232\350\256\256\346\200\273\347\273\223

    使用git add添加要提交的文件的时候,如果文件名是中文,会显示形如274\232\350\256\256\346\200\273\347\273\223的乱码. 解决方案:在bash提示符下输入: ...

  5. jni 写一个简单的photoshop

    第一步创建 ui <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and ...

  6. request.startAsync()不支持异步操作

    Servlet3.0使用异步处理时,后台报错: java.lang.IllegalStateException: A filter or servlet of the current chain do ...

  7. SVN-两种存储方式的比较(BDB vs. FSFS)

    Subversion 的版本库(repository),就是位于服务器端,统一管理和储存数据的地方.本文中,我们以 Linux 为例,介绍在服务器端配置和管理 Subversion 版本库的基本方法. ...

  8. PHP基础知识(二)

    Global namespace  //看不懂看下面的中文 中英结合看看 When using namespaces, you may find that internal functions(内部( ...

  9. vs2012升级到vs2013后,sql server 无法通过IP登录解决方案

    因项目需要,vs升级到2013,可是数据库通过IP却无法连接,一直报内存异常,困扰许久,原来是.net框架出了问题,可以通过用管理员身份运行:netsh winsock reset解决!

  10. 赵雅智_service生命周期

    Android中的服务和windows中的服务是类似的东西,服务一般没实用户操作界面.它执行于系统中不easy被用户发觉,能够使用它开发如监控之类的程序. 服务的开发步骤 第一步:继承Service类 ...