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 异常问题详解 ConcurrentModificationException 异常是 Java 中一个常见的异常,它发生在 Iterator 遍历集合时,集合同时被修改引起的异常。在 Java 中,集合类如 ...
ConcurrentModificationException异常是在Java编程中处理集合时经常会遇到的一个问题。当集合正在被迭代时,如果同时又对其进行修改(比如增加、删除元素等操作),就可能会触发此异常。解决这个问题的方法有很多种...
Java中的ConcurrentModificationException异常通常会在单线程环境中产生,当对集合进行迭代的过程中,集合的结构在迭代器创建后被修改(增加或删除元素)时抛出。在多线程环境中,处理集合数据时,这种情况更容易...
ConcurrentModificationException异常是Java中常见的运行时异常,尤其在多线程环境下对集合进行迭代时,如果另一个线程同时对集合进行修改操作,就可能会抛出这种异常。为了解决这个问题,我们有几种策略可以采取。 ...
在多线程编程中,对集合进行迭代操作时可能会遇到ConcurrentModificationException异常,该异常是因为在迭代过程中,集合结构被其他线程修改,从而导致迭代器状态不一致,进而抛出异常。HarmonyOS或其他Java开发环境...
其中一个典型的问题就是java.util.ConcurrentModificationException异常,通常在遍历集合时试图修改集合内容时抛出。Java提供了几种解决方案来应对这种情况,以下是详细的解决方法和知识点: ### 并发集合的使用 ...
如果在遍历集合或数组时,修改了集合或数组的内容,这可能会引发ConcurrentModificationException异常。这种异常是在运行时抛出的,而不是在编译期。 例如,在遍历集合时,修改集合的内容可能会引发...
Fail-fast机制是一种快速失败机制,在集合遍历过程中,一旦发现容器中的数据被修改了,会立刻抛出ConcurrentModificationException异常,从而导致遍历失败。这种机制下的集合容器,例如HashMap和ArrayList等,都是...
3. Iterator 迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到该集合已经被修改(通常是程序中其它线程修改),程序立即引发 ConcurrentModificationException 异常,而不是显示修改后的结果,这样...
3. 迭代过程中,即使Map结构被修改,也不会抛ConcurrentModificationException异常; 4. 除了数组+链表+红黑树的基本结构外,新增了转移节点,是为了保证扩容时的线程安全的节点; 5. 提供了很多Stream流式方法,...
只读迭代:由于写时复制的机制,CopyOnWriteArraySet 的迭代器是只读的,即迭代过程中不会抛出 ConcurrentModificationException 异常。但是,迭代器获得的数据可能不包含最新的修改。 较高的内存占用:由于每次...
快速失败(Fail-Fast)迭代器机制是指在用迭代器遍历集合的过程中,如果检测到集合在迭代过程中被修改了,就会迅速抛出ConcurrentModificationException异常。快速失败机制的迭代器是为单线程设计的,因为它们不能...
Iterator的特点是只能单向遍历,但是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出ConcurrentModificationException异常。 5. 引用的对象是否一定能存活?不一定,看Reference类型,弱...
Java的List集合在遍历元素时若需要删除元素,应避免直接使用集合的remove方法,因为这样做会触发ConcurrentModificationException异常。正确的做法是使用迭代器Iterator或ListIterator,并且在遍历过程中使用迭代器...
这意味着在多线程环境下,当一个线程正在遍历集合(通过迭代器进行)时,另一个线程修改了集合内容,就会触发快速失败(fail-fast)机制,导致ConcurrentModificationException异常。例如,上述代码中,线程在删除...