参考: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. MS SQL server中的isnull函数

    一.ISNULL语法格式 ISNULL ( check_expression , replacement_value ) 二.参数简介 check_expression:将被检查是否为 NULL的表达 ...

  2. Vue2.0+Webpack项目环境构建到发布

    前言:为什么要用webpack搭建项目呢,因为这个工具可以把目前浏览器不全部支持的ES6语法,通过打包工具生成所有浏览器都支持的单个JS文件. 参考: https://blog.csdn.net/u0 ...

  3. Docker背景介绍

    背景介绍 Docker是PasS提供商DoctCloud开源的一个基于LXC的高级容器引擎,源代码托管在Github上,基于go语言并遵从Apache2.0协议开源.Docker近期非常火热,无论是从 ...

  4. hdoj 1272 小希的迷宫 又一个并查集的简单应用

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  5. 喵神 onevcat 的直播首秀

    喵神 onevcat 的直播首秀   王巍在圈内人称喵神,我和他在网上很早就认识,平时多有交流.在我眼中,他是一个幽默风趣高手.虽然他的博客中主要内容是 iOS 开发,但是他实际上涉及的技术领域还包括 ...

  6. maven中配置jdk版本

    1 maven 中配置 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins< ...

  7. pc或者微信上用pdf.js在线预览pdf和word

    最近项目要求pdf和word可以在线预览功能,pc端还好解决,但是微信端就有点坑了,pc端原来的思路是将文件转成base64,然后用html格式显示 ,但是微信端不支持, 这种方式就pass掉了,谷歌 ...

  8. DelphiXE8FMX工程实现无边框托动(FMX内部方法)

    注意: 可以实现效果,但不知道我的用法对不对(或着说是不是最优化的用法),望高手们指教. 实例代码: unit Unit1; interface uses System.SysUtils, Syste ...

  9. python学习笔记(8)--爬虫下载占位图片

    说明: 1. 虽然很简单,但总忘,所以还是记下来吧! 2. http://placekitten.com/300/300这个画猫的网站老是打开没有图片,改成了http://placehold.it/3 ...

  10. iOS中的动画(转载)

    iOS中的动画  最近两天没事在慢慢学习一些动画,好多东西长时间不用都给忘了,找到一篇介绍很详细的文章就粘贴了过来以备复习,原文地址:https://my.oschina.net/aofe/blog/ ...