参考: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();

  

List remove及ConcurrentModificationException异常的更多相关文章

  1. 集合遍历remove时ConcurrentModificationException异常

    1.集合遍历时候,有时候需要remove或add操作,这时候遍历方式可能会影响程序运行 例如: @Test public void test1() { List<Integer> intL ...

  2. Java ConcurrentModificationException异常原因和解决方法

    Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.u ...

  3. Java并发编程:Java ConcurrentModificationException异常原因和解决方法

    Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.u ...

  4. java集合--java.util.ConcurrentModificationException异常

    ConcurrentModificationException 异常:并发修改异常,当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常.一个线程对collection集合迭代,另一个线程对Co ...

  5. 【转】Java ConcurrentModificationException 异常分析与解决方案--还不错

    原文网址:http://www.2cto.com/kf/201403/286536.html 一.单线程 1. 异常情况举例 只要抛出出现异常,可以肯定的是代码一定有错误的地方.先来看看都有哪些情况会 ...

  6. 【转】ConcurrentModificationException异常解决办法 --不错

    原文网址:http://blog.sina.com.cn/s/blog_465bcfba01000ds7.html 1月30日java.util.ConcurrentModificationExcep ...

  7. 【转】Java ConcurrentModificationException异常原因和解决方法

    原文网址:http://www.cnblogs.com/dolphin0520/p/3933551.html Java ConcurrentModificationException异常原因和解决方法 ...

  8. ConcurrentModificationException异常解决办法

    今天在写一个带缓存功能的访问代理程序时出现了java.util.ConcurrentModificationException异常,因为该异常是非捕获型异常而且很少见,所以费了些时间才找到问题所在,原 ...

  9. 修改List报ConcurrentModificationException异常原因分析

    使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析 在使用Iterator来迭代遍历List的时候如果修改该List对象,则会报jav ...

随机推荐

  1. Python 爬虫实例(3)—— 爬取今日头条as cp 算法 解密

    关于今日头条的 as cp 算法,只是对时间进行了加密,他们的js代码是压缩处理的,正常格式化就可以了 url = "http://www.toutiao.com/api/pc/feed/& ...

  2. AutoFac文档5(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 扫描 autofac可 ...

  3. ubuntu环境下配置jdk

    方法1:修改/etc/profile 文件 /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 所有用户 ...

  4. ubuntu下载linux内核源码

    ubuntu仓库里面关于源码部分配置的好全啊,什么都有,ps:包括vim的各种插件居然也有人打包放到仓库里,真是方便. 1.首先查看一下本系统使用的内核版本号: cat /proc/version L ...

  5. Linux 硬链接和软链接

    硬链接:ln 源文件 新建名 指向同一个文件,并独立存在.当源文件删除不会影响硬链接文件的读取.不能跨文件系统和目录建连接. 例:新建一个文件吧!名字test 硬链接为t1. 查看文件,发现2个文件最 ...

  6. 【Android】13.4 使用SQLite.NET.Async-PCL访问SQLite数据库

    分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 这一节演示如何利用以异步方式(async.await)访问SQLite数据库. 二.示例4运行截图 下面左图为初始 ...

  7. ilmerge工具合并多个DLL或EXE

    这是一个微软提供的合并多个DLL 或是将DLL合并进EXE的工具 首先下载这个工具:ilmerge http://www.microsoft.com/en-us/download/details.as ...

  8. 三、请求库之requests模块

    一 介绍   #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) #注意:requests库发送请求将网 ...

  9. 【已解决】vbox + ubuntu 设置 1366x768 分辨率

    1. 打开VBOX(Oracle VM VirtualBox),启动Ubuntu 2. 点击"设备>安装增强功能" 3. 进入Ubuntu打开文件管理器,如下图 4. 输入r ...

  10. python模块:xlsxwriter和xlrd相结合读取

    python模块简单说明: xlsxwriter:负责写入数据 xlrd:负责读取数据 xlsxwriter 官方文档:http://xlsxwriter.readthedocs.org 本实例是刚写 ...