集合ConcurrentModificationException

疑问点

1、为什么java的ArrayList,HashMap等在迭代的过程中不能够删除值或者是增加元素?做限制的原因是什么
参考:http://guhanjie.iteye.com/blog/1471031

2、为什么在如果在迭代的过程中进行了修改,抛出的是ConcurrentModificationException?
使用Iterator进行迭代的默认的规则就是你自己在迭代的过程中,是不会进行元素的修改的,因为你知道那样做是会出现问题的(具体会出现什么问题,参考1的链接)。那么只有在你迭代的过程中,其他的线程对这个集合进行了修改,会出现容器内容被修改的情况,所以抛出的是并发修改异常。

3、为什么允许使用iterator.remove的方法进行remove.
因为这个remove能够保证一定不会对当前的迭代产生影响,他移除的是当前元素,同时修改了访问的cursor值,不会对后续的遍历造成影响。

4 会产生这个异常的根本原因 – 在遍历过程中,无法保证没有其他的线程不对原始的集合进行修改。然后如果出现了其他线程对集合的修改,将无法保证遍历的正确性。

5 通过checkForComodification的方法来保证迭代过程中不应该对集合进行修改,如果修改了就马上失败(快速失败),避免后续可能出现的混乱的情况 — checkForComodification等:http://www.cnblogs.com/chenssy/p/3821328.html

6 解决方案:遍历的时候,拷贝一份数据来自己遍历。 CopyOnWriteArrayList就是这么做的,因为自己拷贝了一份数据,不存在其他线程会修改你拷贝的数据的情况发生,因为只有当前线程才知道你拷贝的数据的 引用。

展开阅读全文

ConcurrentModificationException问题?

12-02

[code]rnimport java.util.*;rnrnpublic class TryIteratorRemove rn public static void main(String [] args)rn Collection myCollection = new ArrayList(10);rn rn myCollection.add("123");rn myCollection.add("456");rn myCollection.add("789");rn rn int i=0;rn rn for(Iterator it = myCollection.iterator();it.hasNext();) rn String myObject = (String)it.next();rn System.out.println(myObject);rn rn i++;rnrn if(i==1)rn //myCollection.remove(myObject);rn it.remove();rn rn rnrn System.out.println("After remove,the size of myCollection is: " +rn myCollection.size()+" \n and its content is: ");rnrn for(String s : myCollection)rn System.out.println(s);rn rn rnrn[/code]rnrn 对于上面这段程序,为什么用'myCollection.remove(myObject);'时会报'ConcurrentModificationException'异常?而用'it.remove();'时没事呢?rnrn 我想从Java的源代码上找解释,可不知道从哪个类入手,把能想到的类都看了看,也没有解释通,请高手帮我看看。rn 谢谢!!rnrn后来从书上看到以下解释:rn "if one thread changes a collection while another rnthread is traversing it through with an iterator the iterator.hasNext() or iterator.next() call will throw rnConcurrentModificationException. Even the synchronized collection wrapper classes SynchronizedMap and rnSynchronizedList are only conditionally thread-safe, which means all individual operations are thread-safe but compound rnoperations where flow of control depends on the results of previous operations may be subject to threading issues."rn 不过我有以下疑问:rn 1,上面程序出错是由于线程问题吗?上面说到'当一个线程用iterator遍历collection时,另一个线程修改colleciton,iterator.hasNext()或iterator.next()就会抛出ConcurrentModificationException异常'。我想知道在上面我写的那段程序中是main线程修改这个collection吗?那对collection进行遍历的线程又是哪个呢?是Iterator自己又开了一个线程?rn 2,有没有例子演示下'all individual operations are thread-safe but compound rnoperations where flow of control depends on the results of previous operations may be subject to threading issues.'这段说的是什么?这个individual operations指的会是什么? 论坛

没有更多推荐了,返回首页