C#中Dictionary和多线程的ConcurrentDictionary那些事儿

    在.NET4.0以前,在多线程环境下如果我们使用Dictionary类,只能自己编码实现线程同步来保证线程安全,别无他选。在.NET4.0以后微软替我们开发了ConcurrentDictionary类,如果你使用字典遇到线程安全的问题,那么就使用ConcurrentDictionary类,不用再考虑“Dictionary+Locks”的问题了。

    下面我们对比来看看加锁后的Dictionary和ConcurrentDictionary的使用情况,是否解决了问题下,性能如何呢?

string res = "";
 var concurrentDictionary = new ConcurrentDictionary<int, string>();
 var dictionary = new Dictionary<int, string>();
 dictionary.TryAdd(1, "aa");
 concurrentDictionary.TryAdd(1,"");
     var sw = new Stopwatch();
     sw.Start();
 Parallel.For(0, 1000000, i =>//Parallel使用并行循环
 {
     lock (dictionary)
     {


         dictionary[i] = new Random().Next(1000, 9999).ToString();
     }
 });
 sw.Stop();
 Console.WriteLine("加锁写入dictionary {0}", sw.Elapsed);
 //wrinting to dictionary with a lock: 00:00:00.0633939
 sw.Restart();
 Parallel.For(0, 1000000, i =>
 {
     concurrentDictionary[i] = new Random().Next(1000, 9999).ToString();
 });
     sw.Stop();
     Console.WriteLine("concurrentdictionary写入时长 : {0}", sw.Elapsed);


     sw.Restart();
 Parallel.For(0, 1000000, i =>
 {
     lock (dictionary)
     {
         res = dictionary[i];
     }
 });
 sw.Stop();
 Console.WriteLine("读取dictionary耗时: {0}", sw.Elapsed);
 sw.Restart();
 Parallel.For(0, 1000000, i =>
 {
     res = concurrentDictionary[i];
 });
 sw.Stop();
 Console.WriteLine("读取concurrentdictionary耗时: {0}", sw.Elapsed);
 Console.ReadLine();

结果如下

f69b7791e1d460f7ead1c523adad86e4.png

ConcurrentDictionary和Dictionary运行结果显示,读取写入的效率都是ConcurrentDictionary胜出,完美,也未出现线程安全的问题。注意环境关系可能略有差距。据说在多核多线程的情况下concurrentDictionary将有更好的性能表现。

面试官也可能问Dictionary怎么解决线程安全问题,如果答出使用ConcurrentDictionary一定是加分项。

注意,有网友指出ConcurrentDictionary使用依然会有线程安全问题,楼主目前没有发现,大家可以自己试一试。

小妙招

tryadd的使用,在字典中添加的时候,集合里已经包含了指定的key,Add方法会出错,抛出异常,如果使用tryadd就会避免这个问题,添加失败会返回false。

dictionary.TryAdd(1, "aa");
 concurrentDictionary.TryAdd(1,"");

注意ConcurrentDictionary只支持TryAdd,普通Dictionary的TryAdd和Add都支持。

版权声明:本文来源于网友收集或网友提供,仅供学习交流之用,如果有侵权,请转告版主或者留言,本公众号立即删除。

技术群:添加小编微信并备注进群
小编微信:mm1552923   公众号:dotNet编程大全
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值