zoukankan      html  css  js  c++  java
  • 线程安全的集合

    今日要闻:特朗普跟金胖子见面了!

    线程安全的集合是个什么意思?大概解释一下:就是说多个线程同时操作一个集合,不会导致业务数据错乱就叫线程安全的集合。我们知道集合有很多种,数组,List,Dictionary,HashTable等等,就不一一列举了。今天测试的列子是用了List和ConcurrentQueue(.Net自带线程安全的集合)。

    还是老规矩,先来一张效果图:

    对着图给大家讲解一下:

    首先我实例化了两个集合对象:

    List<int> lists = new List<int>();

    ConcurrentQueue<int> cq = new ConcurrentQueue<int>();

    同时并行往集合中添加10000条数据,结果发现List的元素有丢失的情况发生,但是ConcurrentQueue正常。代码很简单:

    List<int> lists = new List<int>();
    var result = Parallel.ForEach(Enumerable.Range(1, 10000), (val) => {lists.Add(val); });
    if (result.IsCompleted)
    {
       Console.WriteLine("多线程操作List元素个数:"+lists.Count);
    }
    Console.WriteLine("--------------------------");
     ConcurrentQueue<int> cq = new ConcurrentQueue<int>();
    var result2 = Parallel.ForEach(Enumerable.Range(1, 10000), (val) => 
    { cq.Enqueue(val); });
    int index = 0;
     if (result2.IsCompleted)
    {
       Console.WriteLine("多线程操作ConcurrentQueue元素个数:" + cq.Count);
    } 

    扩展:ConcurrentQueue

         以前一直用List没有接触过ConcurrentQueue,觉得这个类比较有意思,首先这个集合属于线程安全的并且是先进先出(后面会有演示代码)。记得之前有个同学问这个集合没有提供Add()和Remove(),如果我们需要添加元素,我们要是使用它的Enqueue()方法,那如果我们需要移除元素怎么办呢?他提供了一个TryDequeue(out T result),这个方法比较有意思,它的解释是移除并返回第一个元素。讲到这里就和前面说的先进先出是不是有点关系了。

    ConcurrentQueue<Person> cqp = new ConcurrentQueue<Person>();
    Person p2 = new Person();//定义一个被移除的接受对象
     var result3 = Parallel.ForEach(Enumerable.Range(1, 10), (val) =>
    {
    
       Person p = new Person();
       p.Name = "张三" + val;
       p.Age = val;
       p.Sex = "女";
       cqp.Enqueue(p);
    });
    if (result3.IsCompleted)
     {
          bool a= cqp.TryDequeue(out p2);
          if (a)
          {
             Console.WriteLine("被移除的元素name属性:"+p2.Name);
              Console.WriteLine("移除后的元素个数:" + cqp.Count);
           }
    
    }
    

    TryPeek(out T result)是他的另一个方法。只返回不移除。好啦!留个笔录!

  • 相关阅读:
    【奇妙dp】ARC107D Number of Multisets
    【最短路-拆点】ARC061Cすぬけ君の地下鉄旅行/Snuke's Subway Trip
    【数学-思维-枚举方式】ARC060B 桁和/Digit Sum
    ARC107C Shuffle Permutation【有脑就行qwq/完全不知道怎么分类嘛】
    【kmp-循环节】ARC060D 最良表現/Best Representation
    【简单dp】ARC059C キャンディーとN人の子供 / Children and Candies
    【状压】ARC058E 和風いろはちゃん / Iroha and Haiku
    快速乘
    Miller Rabin素数测试和Pollard Rho算法
    JAVA补充-接口
  • 原文地址:https://www.cnblogs.com/stoneWl/p/9099551.html
Copyright © 2011-2022 走看看