ConcurrentModificationException异常总结-多线程方式

1、多线程方式发生异常举例

1.1、java代码如下:

final List<String> myList = createTestData();

new Thread(new Runnable() {

    @Override
    public void run() {
        for (String string : myList) {
            System.out.println("遍历集合 value = " + string);

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}).start();

new Thread(new Runnable() {

    @Override
    public void run() {

        for (Iterator<String> it = myList.iterator(); it.hasNext();) {
            String value = it.next();

            System.out.println("删除元素 value = " + value);

            if (value.equals("3")) {
                it.remove();
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}).start();

1.2、异常信息打印如下:

遍历集合 value = 1
删除元素 value = 1
删除元素 value = 2
遍历集合 value = 2
遍历集合 value = 3
删除元素 value = 3
删除元素 value = 4
Exception in thread "Thread-0" java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
    at java.util.AbstractList$Itr.next(AbstractList.java:343)
    at com.primeton.test.Test$1.run(Test.java:119)
    at java.lang.Thread.run(Thread.java:619)
删除元素 value = 5

当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。说明以上办法在同一个线程执行的时候是没问题的,但是在异步情况下依然可能出现异常。

2、解决办法

2.1、采用以下代码,将不会出现之前的异常

final List<String> myList = new CopyOnWriteArrayList<String>();
myList.add("1");
myList.add("2");
myList.add("3");
myList.add("4");
myList.add("5");

new Thread(new Runnable() {
    @Override
    public void run() {
        for (String string : myList) {
            System.out.println("遍历集合 value = " + string);

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}).start();

new Thread(new Runnable() {

    @Override
    public void run() {

        for (int i = 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();

2.2、输出结果

遍历集合 value = 1
删除元素 value = 1
遍历集合 value = 2
删除元素 value = 2
遍历集合 value = 3
删除元素 value = 3
遍历集合 value = 4
删除元素 value = 4
遍历集合 value = 5
删除元素 value = 5

3、相关总结

1、使用Collections.synchornizedXxx方法,获得线程安全对象

2、使用java.util.concurrent/java.util.concurrent.atomic并发编程对象开发

另附java中线程安全的类:HashTable、Vector、Stack、StringBuffer等

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-29 14:00:58

ConcurrentModificationException异常总结-多线程方式的相关文章

在多线程的情况下是由Iterator遍历修改集合对象,报ConcurrentModificationException()异常的根因分析

遍历List时抛ConcurrentModificationException异常原理分析 http://www.blogjava.net/houlinyan/archive/2008/04/01/189924.html

(转)Java ConcurrentModificationException异常原因和解决方法

转自 http://www.cnblogs.com/dolphin0520/p/3933551.html 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常.下面我们就来讨论以下这个异常出现的原因以及解决办法. 以下是本文目录大纲: 一.ConcurrentModificationException异常出现的原因 二.在单线程环境下的解决办法 三.在多线程环境下的解

Java ConcurrentModificationException异常原因和解决方法

在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常.下面我们就来讨论以下这个异常出现的原因以及解决办法. 以下是本文目录大纲: 一.ConcurrentModificationException异常出现的原因 二.在单线程环境下的解决办法 三.在多线程环境下的解决方法 若有不正之处请多多谅解,并欢迎批评指正 请尊重作者劳动成果,转载请标明原文链接: http://w

java.util.ConcurrentModificationException异常分析

Java在操作ArrayList.HashMap.TreeMap等容器类时,遇到了java.util.ConcurrentModificationException异常.以ArrayList为例,如下面的代码片段: [java] view plaincopy import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArr

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

Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常.下面我们就来讨论以下这个异常出现的原因以及解决办法. 以下是本文目录大纲: 一.ConcurrentModificationException异常出现的原因 二.在单线程环境下的解决办法 三.在多线程环境下的解决方法 若有不

ConcurrentModificationException异常解决办法

今天在写一个带缓存功能的访问代理程序时出现了java.util.ConcurrentModificationException异常, 因为该异常是非捕获型异常而且很少见,所以费了些时间才找到问题所在,原来在通过Iterator进行遍历的时候,如果直接对HashMap进行操作后,再继续用之前的Iterator进行遍历就会出现这个异常,表示其HashMap已经被修改. 源程序代码片段如下:caches为一个HashMap对象 1 String sameKeyPart = accesserClassN

ArrayList引起的ConcurrentModificationException 异常原因及解决方法

一.单线程 1. 异常情况举例 只要抛出出现异常,可以肯定的是代码一定有错误的地方.先来看看都有哪些情况会出现ConcurrentModificationException异常,下面以ArrayList remove 操作进行举例: 使用的数据集合: ? 1 2 3 4 5 6 7 List<string> myList = new ArrayList<string>(); myList.add( "1"); myList.add( "2")

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

原文网址:http://www.2cto.com/kf/201403/286536.html 一.单线程 1. 异常情况举例 只要抛出出现异常,可以肯定的是代码一定有错误的地方.先来看看都有哪些情况会出现ConcurrentModificationException异常,下面以ArrayList remove 操作进行举例: 使用的数据集合: ? 1 2 3 4 5 6 7 List<string> myList = new ArrayList<string>(); myList.

Java ConcurrentModificationException异常原因和解决方法(转)

摘自:http://www.cnblogs.com/dolphin0520/p/3933551.html#undefined 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常.下面我们就来讨论以下这个异常出现的原因以及解决办法. 以下是本文目录大纲: 一.ConcurrentModificationException异常出现的原因 二.在单线程环境下的解决办法 三