ConcurrentModificationException集合的并发修改异常(问题解决)

}

System.out.println(list);

}

}

结果是报错

在这里插入图片描述

下面是正确代码

方法一

通过for循环遍历集合,增加元素

在集合的末尾添加元素

package review.ListDemo1;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import java.util.ListIterator;

public class demo12 {

public static void main(String[] args) {

List list = new ArrayList();

list.add(“hadoop”);

list.add(“hive”);

list.add(“java”);

list.add(“flume”);

//方法一,通过for循环遍历集合,增加元素

for(int i=0;i<list.size();i++){

Object o = list.get(i);

String s = (String)o;

if(“java”.equals(s)){

list.add(“hello”);

}

}

System.out.println(list);

}

}

在这里插入图片描述

方法二

迭代器遍历,迭代器修改

在该元素的后面添加元素

List特有的迭代器,ListIterator

ListIterator listIterator()

该迭代器继承了Iterator接口,在其中就可以使用hasNext()和next方法

package review.ListDemo1;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import java.util.ListIterator;

public class demo12 {

public static void main(String[] args) {

List list = new ArrayList();

list.add(“hadoop”);

list.add(“hive”);

list.add(“java”);

list.add(“flume”);

//方法二

ListIterator it = list.listIterator();

while(it.hasNext()){

Object o = it.next();

String s = (String)o;

if(“java”.equals(s)){

it.add(“yes”);

}

}

System.out.println(list);

总结:绘上一张Kakfa架构思维大纲脑图(xmind)

image

其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?

若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理

梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码

必看视频!获取2024年最新Java开发全套学习资料 备注Java

,那么接下来的这份《手写“kafka”》将会是个不错的选择。

  • Kafka入门

  • 为什么选择Kafka

  • Kafka的安装、管理和配置

  • Kafka的集群

  • 第一个Kafka程序

  • Kafka的生产者

  • Kafka的消费者

  • 深入理解Kafka

  • 可靠的数据传递

  • Spring和Kafka的整合

  • SpringBoot和Kafka的整合

  • Kafka实战之削峰填谷

  • 数据管道和流式处理(了解即可)

image

image

费者

  • 深入理解Kafka

  • 可靠的数据传递

  • Spring和Kafka的整合

  • SpringBoot和Kafka的整合

  • Kafka实战之削峰填谷

  • 数据管道和流式处理(了解即可)

[外链图片转存中…(img-4WOoRWfD-1716405858225)]

[外链图片转存中…(img-UFgxxf5E-1716405858225)]

### ConcurrentModificationException 异常的原因及解决方案 #### 异常原因 `java.util.ConcurrentModificationException` 是 Java 中的一种运行时异常,通常发生在使用迭代器(Iterator)遍历集合对象(如 `ArrayList`、`HashMap` 等)的过程中。当集合的结构被非迭代器自身的方法修改时(例如通过 `add` 或 `remove` 方法),就会抛出此异常[^2]。 这种异常的核心机制在于迭代器的 **fail-fast** 特性。在遍历过程中,迭代器会检查集合修改计数器(`modCount`)是否与预期值(`expectedModCount`)一致。如果不一致,则说明集合在遍历过程中发生了结构上的修改,从而抛出 `ConcurrentModificationException`[^4]。 以下是异常检测源码的关键部分: ```java final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } ``` 上述代码展示了迭代器在每次调用 `next()` 方法时,都会执行 `checkForComodification()` 方法以确保集合未被并发修改。如果发现修改计数器不匹配,则立即抛出异常[^1]。 #### 解决方案 为避免 `ConcurrentModificationException`,可以采用以下几种方法: 1. **使用 Iterator 的 remove 方法** 在遍历集合时,应通过迭代器自身的 `remove()` 方法来移除元素,而不是直接调用集合的 `remove()` 方法。例如: ```java List<Integer> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { list.add(i); } Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) { Integer value = iterator.next(); if (value == 5) { iterator.remove(); // 使用迭代器的 remove 方法 } } ``` 2. **使用线程安全的集合类** 如果需要在多线程环境中操作集合,可以考虑使用线程安全的集合实现,例如 `CopyOnWriteArrayList` 或 `ConcurrentHashMap`。这些集合类通过内部机制保证了线程安全性,避免了 `ConcurrentModificationException` 的发生[^3]。 3. **使用同步块** 对于非线程安全的集合类,可以通过加锁的方式保护集合的访问和修改。例如: ```java List<Integer> list = Collections.synchronizedList(new ArrayList<>()); synchronized (list) { Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) { Integer value = iterator.next(); if (value == 5) { iterator.remove(); } } } ``` 4. **避免在增强 for 循环修改集合** 增强 for 循环本质上也是基于迭代器实现的,因此在循环体内直接调用集合的 `remove()` 方法会导致异常。例如以下代码会抛出异常: ```java List<Integer> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { list.add(i); } for (Integer value : list) { // 增强 for 循环 if (value == 5) { list.remove(value); // 抛出 ConcurrentModificationException } } ``` 正确的做法是改用显式的迭代器进行操作。 #### 示例代码 以下是一个完整的示例,展示如何正确处理 `ConcurrentModificationException`: ```java import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { list.add(i); } // 正确方式:使用 Iterator 的 remove 方法 Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) { Integer value = iterator.next(); if (value == 5) { iterator.remove(); // 安全移除 } } System.out.println(list); // 输出结果:[0, 1, 2, 3, 4, 6, 7, 8, 9] } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值