c# 多线程 执行事件 并发_并发处理,锁或线程

简单的总结下对预防并发的理解:预防并发其实就是将并行执行修改为串行执行。(关于数据库并发问题大家可参考我的博客:C# 数据库并发的解决方案(通用版、EF版))

背景

C#命名空间:System.Collenctions和System.Collenctions.Generic 中提供了很多列表、集合和数组。例如:List<T>集合,数组Int[],String[] ......,Dictory<T,T>字典等等。但是这些列表、集合和数组的线程都不是安全的,不能接受并发请求。下面通过一个例子来加以说明,如下:

class Program

{

private static object o = new object();

private static List<Product> _Products { get; set; }

* 代码中 创建三个并发线程 来操作_Products 集合

* System.Collections.Generic.List 这个列表在多个线程访问下,不能保证是安全的线程,所以不能接受并发的请求,我们必须对ADD方法的执行进行串行化

*/

static void Main(string[] args)

{

_Products = new List<Product>();

/*创建任务 t1 t1 执行 数据集合添加操作*/

Task t1 = Task.Factory.StartNew(() =>

{

AddProducts();

});

/*创建任务 t2 t2 执行 数据集合添加操作*/

Task t2 = Task.Factory.StartNew(() =>

{

AddProducts();

});

/*创建任务 t3 t3 执行 数据集合添加操作*/

Task t3 = Task.Factory.StartNew(() =>

{

AddProducts();

});

Task.WaitAll(t1, t2, t3);

Console.WriteLine(_Products.Count);

Console.ReadLine();

}

/*执行集合数据添加操作*/

static void AddProducts()

{

Parallel.For(0, 1000, (i) =>

{

Product product = new Product();

product.Name = "name" + i;

product.Category = "Category" + i;

product.SellPrice = i;

_Products.Add(product);

});

}

}

class Product

{

public string Name { get; set; }

public string Category { get; set; }

public int SellPrice { get; set; }

}

本例中,开辟了三个线程,通过循环向集合中添加数据,每个线程执行1000次(三个线程之间的操作是同时进行的,也是并行的),那么,理论上结果应该是3000。

上文中我们讲到: C#命名空间:System.Collenctions和System.Collenctions.Generic 下的列表,数组,集合并不能保证线程安全,并不能防止并发的发生。

本例运行的结果也证明了上述结论的正确性,其结果如下:

a22adbf955c63fd869a00a90063ba86e.png

由此可见:C#命名空间:System.Collenctions和System.Collenctions.Generic 下的列表,数组,集合确实不能保证线程安全,确实不能预防并发。那么我们应当怎么解决上述问题呢?

还好,自C#2.0以来,LOCK是

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值