zoukankan      html  css  js  c++  java
  • List remove及ConcurrentModificationException异常

    参考:http://blog.csdn.net/androidboy365/article/details/50540202/

    解决方案

    // 1 使用Iterator提供的remove方法,用于删除当前元素
    
     for(Iterator<string> it = myList.iterator(); it.hasNext();) {
    
         String value = it.next();
    
          if(value.equals("3")) {
    
              it.remove(); // ok
    
         }
    
    }
    
    System. out.println( "List Value:"  + myList.toString());
    
     
    
     // 2 建一个集合,记录需要删除的元素,之后统一删除            
    
    List<string> templist = newArrayList<string>();
    
     for(String value : myList) {
    
          if(value.equals("3")) {
    
              templist.remove(value);
    
         }
    
    }
    
     // 可以查看removeAll源码,其中使用Iterator进行遍历
    
    myList.removeAll(templist);
    
    System. out.println( "List Value:"  + myList.toString());       
    
     
    
      // 3. 使用线程安全CopyOnWriteArrayList进行删除操作
    
    List<string> myList = newCopyOnWriteArrayList<string>();
    
    myList.add("1");
    
    myList.add("2");
    
    myList.add("3");
    
    myList.add("4");
    
    myList.add("5");
    
     
    
    Iterator<string> it = myList.iterator();
    
     
    
     while(it.hasNext()) {
    
         String value = it.next();
    
          if(value.equals("3")) {
    
              myList.remove("4");
    
              myList.add("6");
    
              myList.add("7");
    
         }
    
    }
    
    System. out.println( "List Value:"  + myList.toString());
    
     
    
     // 4. 不使用Iterator进行遍历,需要注意的是自己保证索引正常
    
     for(inti = 0; i < myList.size(); i++) {
    
         String value = myList.get(i);
    
         System. out.println( "List Value:"  + value);
    
          if(value.equals("3")) {
    
              myList.remove(value); // ok
    
              i--;// 因为位置发生改变,所以必须修改i的位置
    
         }
    
    }
    
    System. out.println( "List Value:"  + myList.toString());
    

      

    单线程情况下列出4种解决方案,但是在多线程情况下仅有第4种方案才能在多线程情况下不出现问题。

    List<string> myList = newCopyOnWriteArrayList<string>();
    
     myList.add("1");
    
     myList.add("2");
    
     myList.add("3");
    
     myList.add("4");
    
     myList.add("5");
    
     
    
    newThread(newRunnable() {
    
       
    
         @Override
    
         publicvoidrun() {
    
              for(String string : myList) {
    
                   System.out.println("遍历集合 value = "  + string);
    
                 
    
                   try{
    
                        Thread.sleep(100);
    
                   }catch(InterruptedException e) {
    
                        e.printStackTrace();
    
                   }
    
              }
    
         }
    
    }).start();
    
     
    
    newThread(newRunnable() {
    
       
    
         @Override
    
         publicvoidrun() {
    
            
    
              for(inti = 0; i < myList.size(); i++) {
    
                   String value = myList.get(i);
    
                 
    
                   System.out.println("删除元素 value = "  + value);
    
             
    
               if(value.equals("3")) {
    
                    myList.remove(value);
    
                    i--;// 注意                          
    
               }
    
             
    
               try{
    
                        Thread.sleep(100);
    
                   }catch(InterruptedException e) {
    
                        e.printStackTrace();
    
                   }
    
              }
    
         }
    
    }).start();
    

      

  • 相关阅读:
    opencv如何载入内存中的图像文件
    C++ 中指针与引用的区别
    2014新版12306接口分析
    Qt 多线程与数据库操作需要注意的几点问题
    设置 Linux 的 LD_LIBRARY_PATH 变量
    linux+Qt程序如何打包发布
    c++(重载、覆盖、隐藏)
    Pytorch中的强化学习
    WordNet简介
    Pytorch中的数学函数
  • 原文地址:https://www.cnblogs.com/JAYIT/p/8252457.html
Copyright © 2011-2022 走看看