废话不多说,上代码:

using System;
using System.Collections.Generic;
using System.Threading.Tasks; namespace ParallelTest
{
class Program
{
static void Main(string[] args)
{
List<Product> products = new List<Product>();
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去验证问题。这也是我写这篇文章的初衷:提醒自己,遇到问题,不要凭空猜测,要有动手验证的决心。

最新文章

  1. HTML-如何让自己的网页标题处可以显示网站的logo?
  2. 【转】ASP.NET MVC 使用 FluentScheduler 定时器计划任务
  3. 看奢侈品Prada如何使用物联网
  4. [Leetcode][Python]51: N-Queens
  5. Java学习笔记-File类的基本方法
  6. 集中式(CVS、SVN)VS分布式(Git)
  7. 如何安全退出已调用多个Activity的Application?
  8. MPSOC之1——overview、开发板、工具
  9. python的调试
  10. 为什么Kafka速度那么快
  11. 【Spring源码解读】bean标签中的属性(二)你可能还不够了解的 abstract 属性和 parent 属性
  12. Ajax中文乱码的解决
  13. Fedora 23+CUDA 8.0+ GTX970 安装
  14. SQL Agent 服务无法启动
  15. 【CSS学习】--- 盒子模型
  16. 常用6种type的form表单的input标签分析及示例
  17. pycharm 配置支持vue
  18. 关于struts2中ActionContext类的作用
  19. 基于docker 搭建Elasticsearch6.2.4(centos)
  20. dom4j怎么获得指定名称的节点信息

热门文章

  1. 移动端web app开发学习笔记
  2. mac下Android开发环境的配置
  3. Java_面向对象
  4. python面试题---收藏的笔记
  5. HTML 文本内容居中
  6. Django—跨域请求(jsonp)
  7. 关于Integer比较问题
  8. 2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
  9. 饮冰三年-人工智能-Python-26 Django 学生管理系统
  10. Zabbix (四)用户管理