美文网首页
Parallel线程安全问题

Parallel线程安全问题

作者: 圣杰 | 来源:发表于2018-03-15 15:55 被阅读291次

废话不多说,上代码:

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去验证问题。这也是我写这篇文章的初衷:提醒自己,遇到问题,不要凭空猜测,要有动手验证的决心。

相关文章

  • Parallel线程安全问题

    废话不多说,上代码: 猜一下,运行结果是多少,是999999?抱歉不是的,结果!= 999999。 Net 4.0...

  • 关于并行流中的线程安全问题

    现象 在我们使用java8中的parallel流时可能会遇到线程安全问题,如下面的例子: 运行结果: 解决方案 1...

  • Java线程安全

    线程安全问题的概述 线程安全问题的代码实现 线程安全问题产生的原理 解决线程安全问题_同步代码块 同步代码块:sy...

  • TestNg-09-多线程测试

    TestNg-09-多线程测试1、基于注解 2、基于xml parallel="classs" parallel=...

  • 7.2 Handler消息传递机制

    简介:handler消息处理者,用来发生和处理消息,用于解决线程安全问题; 线程安全问题:多线程导致线程安全问题,...

  • 线程的基本语法

    线程同步[解决线程安全问题] 解决线程安全问题 线程同步方式一:同步代码 语法基本 synchronized (同...

  • 五 异常与多线程——第三节 线程同步机制

    1、线程安全问题的概述 多线程访问了共享的数据,就会产生线程安全问题 2、线程安全问题的代码实现 输出:会出现重复...

  • Python App Scraping ———09.06.201

    Parallel computing, Multithreading, Multiprocess - 线程和进程的...

  • 线程安全问题

    线程安全问题 本篇主要讲解 线程安全问题,演示什么情况下会出现线程安全问题,以及介绍了 Java内存模型 、vol...

  • 垃圾收集器优缺点总结

    Parallel并行: 多条垃圾收集线程并行工作, 此时用户线程仍处于等待状态Concurrent并发: 用户线程...

网友评论

      本文标题:Parallel线程安全问题

      本文链接:https://www.haomeiwen.com/subject/tyrhqftx.html