Parallel线程安全问题
废话不多说,上代码:
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。
解决方案很简单:
- 加锁
- 使用并行集合(System.Collections.ConCurrent)
对于这个问题,我知道其存在潜在的线程安全问题,但是不确定其导致的结果如何?当我截图到处询问无果时,才想到自己动手写demo去验证问题。这也是我写这篇文章的初衷:提醒自己,遇到问题,不要凭空猜测,要有动手验证的决心。
Parallel线程安全问题的更多相关文章
- 被我们忽略的HttpSession线程安全问题
1. 背景 最近在读<Java concurrency in practice>(Java并发实战),其中1.4节提到了Java web的线程安全问题时有如下一段话: Servlets a ...
- Java多线程--线程安全问题的相关研究
在刚刚学线程的时候我们经常会碰到这么一个问题:模拟火车站售票窗口售票.代码如下: package cn.blogs.com.isole; /* 模拟火车站售票窗口售票,假设有50张余票 */ publ ...
- struts2学习笔记--线程安全问题小结
在说struts2的线程安全之前,先说一下,什么是线程安全?这是一个网友讲的, 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样 ...
- iOS中的线程安全问题
为了保证线程安全,不会因为多个线程访问造成资源抢夺,出现的运行结果的偏差问题,我们需要使用到线程同步技术,最常用的就是 @synchronized互斥锁(同步锁).NSLock.dispatch_se ...
- java 22 - 13 多线程之解决线程安全问题的实现方式2
上一章说了,解决线程安全问题的实现方式1是使用同步代码块 同时也知道了,同步代码块的锁对象是任意对象:(Object obj ; Demo d;)这些都行 那么,现在来说解决线程安全问题的实现方式2 ...
- java 22 - 12 多线程之解决线程安全问题的实现方式1
从上一章知道了多线程存在着线程安全问题,那么,如何解决线程安全问题呢? 导致出现问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 上一章的程序,上面那3条都具备, ...
- ios 单一线程中的Runloop机制会导致线程安全问题吗?
今天在处理多线程突然想到一个问题,多核处理器会不会导致,单一线程中,由runloop分发的2个函数同时执行呢?进而同时修改同一个变量,产生bug? 我做了以下的测试: - (void)viewDidL ...
- Spring MVC 线程安全问题的思考
Spring MVC 线程安全问题的思考 在读一些博文的时候发现有些文章对SpringMVC的Controller线程安全的验证并不正确,比如没有探究controller线程不安全的具体原因,比如将请 ...
- HttpSession的线程安全问题及注意事项
摘自http://blog.csdn.net/java2000_net/article/details/2922357 HttpSession session = request.getSessio ...
随机推荐
- RCNN论文学习
[Rich feature hierarchies for accurate object detection and semantic segmentation] Abstract 论文的方 ...
- C++示例
Linux C++ template使用示例: #include <iostream> #include <cstring> using namespace std; temp ...
- Django 之 路由URL,视图,模板,ORM操作
1.后台管理的左侧菜单,默认只有第一个页签下面的选项是显示的,点了别的页签再显示别的页签下面的选项,问题是:点了任何菜单的选项后,左侧菜单又成了第一个页签的选项显示,别的页签隐藏,也就是左侧的菜单刷新 ...
- struts2-剩余2
周一-周四 晚上:7:30 – 9:30 多线程.Linux.云服务器.git spring springboot.springcloud 今晚:7:30 测试直播网速 一.回顾 拦截器:在目标 ...
- ios访问web页面<div>点击事件不起效果,以及alert()显示url的解决办法
ios访问web页面<div>点击不起效果,在其div上添加style=”cursor:pointer:“ jquery web页面动态append()事件调用方法:$(document) ...
- CentOS 7 配置静态IP后不生效 & Job for network.service failed
参考:http://tieba.baidu.com/p/3233996339#57290767555l 在CentOS中配置静态IP后不生效. 解决办法:将/etc/sysconfig/network ...
- js属性对象的propertyIsEnumerable方法
定义 每个对象都有一个propertyIsEnumerable()方法.此方法返回一个布尔值,表明指定的属性是否是可枚举. This method can determine whether the ...
- 网络远程唤醒 WOL Magic Packet
Magic Packet Magic Packet白皮书介绍: The basic technical details of Magic Packet Technologyare simple and ...
- Windows 2008 如何启用 TLS1.1 1.2
1.下载工具:下载>>> 2.在服务器运行本软件,点击“Bes”按钮,然后必须确保有TLS 1.2被选中,SSL2 SSL3可以不用选择,然后点击Apply按钮,这时系统提醒您重启, ...
- Tomcat配置https后,并发较大时,频繁超时情况。
tomcat配置ssl后,出现频繁的访问超时情况. 通过脚本(感谢UCloud的技术支持 金晓帆-): netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a i ...