博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Parallel线程安全问题
阅读量:6388 次
发布时间:2019-06-23

本文共 1348 字,大约阅读时间需要 4 分钟。

废话不多说,上代码:

using System;using System.Collections.Generic;using System.Threading.Tasks;namespace ParallelTest{    class Program    {        static void Main(string[] args)        {            List
products = new List
(); Parallel.For(0, 1000000, (i) => { Product product = new Product(); product.Name = "name" + i; product.Category = "Category" + i; product.SellPrice = i; products.Add(product); }); Console.WriteLine(products.Count); Console.ReadLine(); } } class Product { public string Name { get; set; } public string Category { get; set; } public int SellPrice { get; set; } }}

猜一下,运行结果是多少,是999999?抱歉不是的,结果!= 999999。

运行结果

Net 4.0引入了System.Threading.Tasks,简化了我们进行异步编程的方式,而不用直接与线程和线程池打交道,但这也引入了线程安全问题。

System.Threading.Tasks中的类型被称为任务并行库(TPL)。TPL使用CLR线程池(说明使用TPL创建的线程都是后台线程)自动将应用程序的工作动态分配到可用的CPU中。

其中Parallel是指数据并行,其提供的Parallel.For()或Parallel.ForEach()方法,可以以并行方式对数组或集合中的数据进行迭代。

那之所以出现这个结果,很显然了,是多线程操作集合导致的线程安全问题。

总之,多线程操作集合时一定要注意线程安全的问题,不管是通过Thread、ThreadPool、Task、Parallel还是PLINQ。

解决方案很简单:

  1. 加锁
  2. 使用并行集合(System.Collections.ConCurrent)

对于这个问题,我知道其存在潜在的线程安全问题,但是不确定其导致的结果如何?当我截图到处询问无果时,才想到自己动手写demo去验证问题。这也是我写这篇文章的初衷:提醒自己,遇到问题,不要凭空猜测,要有动手验证的决心。

转载地址:http://grbha.baihongyu.com/

你可能感兴趣的文章
css三角形实现写法全攻略收集
查看>>
Enterprise and the press public MBT Fora
查看>>
js常用代码整理
查看>>
富文本编辑器TinyMCE
查看>>
01_vue实例_数据_方法
查看>>
“穿越”——正则表达式
查看>>
使用 find 命令实现高级排除需求
查看>>
【DEV GridControl】怎样使GridView中满足某个条件的行可编辑,其余行不可编辑?...
查看>>
一只年轻而倒悬的梨
查看>>
解决time_wait过多的问题
查看>>
技术转载:Jni学习一:了解Jni
查看>>
vue教程2-07 自定义指令
查看>>
Node.js之循环依赖
查看>>
python3调用阿里云短信服务
查看>>
Linux-百度云之AccleriderMini使用
查看>>
bootstrapTable refresh 方法使用简单举例
查看>>
2、TestNG+Maven+IDEA环境搭建
查看>>
maven插件运行过程中自动执行sql文件
查看>>
New UWP Community Toolkit - XAML Brushes
查看>>
C# ==、Equals、ReferenceEquals 区别与联系 (转载)
查看>>