`
skeeey
  • 浏览: 34178 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

ConcurrentModificationException异常

    博客分类:
  • java
阅读更多
ConcurrentModificationException异常,一般是由于调用集合框架中集合的remove()方法引起的,但是为什么会引起该异常呢?
原因很简单,就像这个异常的名字修改冲突异常一样,其实就是某个迭代器在另一个迭代器修改某个集合时遍历该集合引起的,因为这样做很容易引起集合的混乱,比如:

List<String> list = new LinkedList<String>();

Iterator it_1 = list.iterator();
Iterator it_2 = list.iterator();

it_1.next();
it_1.remove();
it_2.next(); // will throw ConcurrentModificationException


那么怎样规避这个异常呢?很简单,对一个集合,你可以使用多个迭代器,但是只要保证在众多的迭代器中只有一个可以对集合进行读写,其余的都是只读的。

那么Java中具体是怎么实现的呢?

final void checkForComodification() {
   // modCount是由集合维护的集合改写的数量
   // expectedModCount是由迭代器维护的改写的数量
   if (modCount != expectedModCount)
	throw new ConcurrentModificationException();
   }
}

这是一种既简单,又实用的处理集合并发修改冲突的方式。


参考文章:JAVA2核心技术II 第二章 84页
分享到:
评论

相关推荐

    java.util.ConcurrentModificationException 异常问题详解1

    Java.util.ConcurrentModificationException 异常问题详解 ConcurrentModificationException 异常是 Java 中一个常见的异常,它发生在 Iterator 遍历集合时,集合同时被修改引起的异常。在 Java 中,集合类如 ...

    Java中增强for循环的实现原理和坑详解

    如果在遍历集合或数组时,修改了集合或数组的内容,这可能会引发ConcurrentModificationException异常。这种异常是在运行时抛出的,而不是在编译期。 例如,在遍历集合时,修改集合的内容可能会引发...

    【面试普通人VS高手系列】Fail-safe机制与Fail-fast机制分别有什么作用.doc

    Fail-fast机制是一种快速失败机制,在集合遍历过程中,一旦发现容器中的数据被修改了,会立刻抛出ConcurrentModificationException异常,从而导致遍历失败。这种机制下的集合容器,例如HashMap和ArrayList等,都是...

    使用Iterator接口遍历集合元素

    3. Iterator 迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到该集合已经被修改(通常是程序中其它线程修改),程序立即引发 ConcurrentModificationException 异常,而不是显示修改后的结果,这样...

    ArrayList.md

    3. 迭代过程中,即使Map结构被修改,也不会抛ConcurrentModificationException异常; 4. 除了数组+链表+红黑树的基本结构外,新增了转移节点,是为了保证扩容时的线程安全的节点; 5. 提供了很多Stream流式方法,...

    java集合-CopyOnWriteArraySet的使用

    只读迭代:由于写时复制的机制,CopyOnWriteArraySet 的迭代器是只读的,即迭代过程中不会抛出 ConcurrentModificationException 异常。但是,迭代器获得的数据可能不包含最新的修改。 较高的内存占用:由于每次...

    java-大数据基础面试思考.pdf

    快速失败(Fail-Fast)迭代器机制是指在用迭代器遍历集合的过程中,如果检测到集合在迭代过程中被修改了,就会迅速抛出ConcurrentModificationException异常。快速失败机制的迭代器是为单线程设计的,因为它们不能...

    Java面试题大全.docx

    Iterator的特点是只能单向遍历,但是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出ConcurrentModificationException异常。 5. 引用的对象是否一定能存活?不一定,看Reference类型,弱...

    多线程中使用Java集合类.doc

    这意味着在多线程环境下,当一个线程正在遍历集合(通过迭代器进行)时,另一个线程修改了集合内容,就会触发快速失败(fail-fast)机制,导致ConcurrentModificationException异常。例如,上述代码中,线程在删除...

    java并发容器CopyOnWriteArrayList实现原理及源码分析

    另外,CopyOnWriteArrayList由于其"读写分离"的思想,遍历和修改操作分别作用在不同的list容器,所以在使用迭代器进行遍历时候,不会抛出ConcurrentModificationException异常。 CopyOnWriteArrayList容器的缺点是...

    《Java开发手册(泰山版)》灵魂13问.pdf

    但如果操作不当,例如在遍历ArrayList时直接使用subList方法返回的子列表进行remove操作,可能会导致ConcurrentModificationException异常,因为subList返回的子列表是一个视图,没有自己的迭代器。 5. 避免for循环...

    程序员面试宝典 java.pdf,这是一份不错的文件

    使用Iterator时,应避免在遍历过程中修改集合,因为这可能导致 ConcurrentModificationException 异常。 【ListIterator接口】ListIterator是Iterator的子接口,专为List接口设计,除了提供基本的遍历功能外,还...

    java-集合-知识点汇总

    * fail-fast与fail-safe:Java集合在遍历时可能会抛出ConcurrentModificationException异常,这是因为集合在遍历时可能会被修改。fail-fast机制将抛出异常,而fail-safe机制将忽略修改。 * transient关键字:在...

    HashMap源码剖析共10页.pdf.zip

    HashMap的迭代器是fail-fast的,这意味着在遍历过程中,如果其他线程修改了HashMap,迭代器会抛出ConcurrentModificationException异常。 9. **遍历方式** HashMap提供了两种遍历方式:通过keySet()、entrySet()或...

    面经总结.pdf

    8. 线程安全:HashMap不是线程安全的,如果在多线程环境下,一个线程正在遍历HashMap,同时另一个线程修改了HashMap,这会导致迭代器快速失败(fail-fast),即抛出ConcurrentModificationException异常。...

    Java集合容器面试题(2020最新版)-重点.pdf

    5. 快速失败机制:当集合在迭代过程中被修改时,如果不使用迭代器的remove()方法,可能会触发快速失败,即抛出ConcurrentModificationException异常。 6. Iterator:迭代器是遍历集合的主要方式,提供了hasNext()和...

    集合框架面试题.pdf

    快速失败迭代器在检测到集合结构在迭代过程中被修改时会抛出ConcurrentModificationException异常。这种策略适用于java.util包下的所有集合类,它们不是线程安全的。而java.util.concurrent包下的集合类则提供安全...

    Thread基础知识点笔记总结

    在高并发的情况下使用 ArrayList 的时候,会出现 ConcurrentModificationException 异常。HashSet 底层是 HashMap。 5. 锁 Java 中有两种锁:公平锁和非公平锁。公平锁在队列直接排队,非公平锁先抢锁,抢不到再...

    比较Vector、ArrayList和hashtable hashmap

    在使用时,另一个线程改变了 Vector,那么将会抛出 ConcurrentModificationException 异常。因此,如果多线程并发访问 Vector,通常需要通过 synchronized 关键字进行同步控制。 HashMap 类 HashMap 是一个散列表,...

    ConcurrentHashMap共18页.pdf.zip

    与传统集合类的迭代器不同,ConcurrentHashMap 的迭代器是非阻塞的,即使在遍历过程中有其他线程修改了映射表,迭代器也不会抛出 ConcurrentModificationException 异常,而是能够正确地反映修改后的状态。...

Global site tag (gtag.js) - Google Analytics