java.util.ConcurrentModificationException: 异常解决

异常详细信息

at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)

这个异常是在遍历 list的时候,对list进行删除操作导致的.  一般是增强for循环或者.forEach()的情况。这是因为操作的list删除元素后,元素下标会变,无法确定元素。remove是在原list上进行操作的,是操作的引用

 

改为传统的for循环遍历方式不会报错 ,但这样也不推荐,因为list.size 是变量,删除一个后list.size 会-1,业务逻辑会有问题

 

for (int i = 0; i < list.size(); i++) {
if (list.get(i).getSecond() <=0) {
list.remove(i);
}
}

解决方法: 使用filter过滤,达到删除的效果
list = list.stream().filter(item -> !(item.getSecond() <= 0)).collect(Collectors.toList());  //可以看到这样是新建的一个list,尽管我还是用之前的list接的,但是内存地址是不一样的,他是两个list
// list2 = list.stream().filter(item -> !(item.getSecond() <= 0)).collect(Collectors.toList());  这样更好理解一些
因为过滤留下的是满足这个条件的item.getSecond() <= 0,所以前边要加!

下面这行代码是两个list,groupMemberList中可能有与userList中相同id的值,这行代码的作用是过滤掉userList中与
groupMemberList有重复id的值。是一个双层for循环
List<SysUsers> filterUserList = usersList.stream().filter(v-> groupMemberList.stream().noneMatch(
                            m-> m.getId().equals(v.getId()))).collect(Collectors.toList()); //删除已加入学生

 




需要 了解源码的同学请移步:https://www.cnblogs.com/dolphin0520/p/3933551.html

 

这个文章讲的更明白了: https://www.cnblogs.com/scott1102/p/17280573.html

温故而知新,CopyOnWriteArrayList --------2024.10.25更新

ConcurrentModificationException出现这种情况的时候可以考虑选用CopyOnWriteArrayList 去实现List列表,写时复制策略,CopyOnWriteArrayList是Java中的一个类,位于java.util.concurrent包下。它是ArrayList的一个线程安全的变体,其中所有可变操作(如add和set等)都是通过创建底层数组的新副本来实现的,因此被称为“写时复制”的列表。

由于CopyOnWriteArrayList在遍历时不会对列表进行任何修改,因此它绝对不会抛出ConcurrentModificationException的异常。它在修改操作(如addset等)时,会复制一份底层数组,然后在新的数组上进行修改,修改完成后再将指向底层数组的引用切换到新的数组。这种设计使得读操作可以在不加锁的情况下进行,从而提高了并发性能,这个特性使得它在多线程环境下进行遍历操作时更为安全。

然而,CopyOnWriteArrayList并没有“扩容”的概念。每次写操作(如add或remove)都需要复制一个全新的数组,这在写操作较为频繁时可能会导致性能问题,因为复制整个数组的操作是相当耗时的。因此,在使用CopyOnWriteArrayList时,需要特别注意其适用场景,一般来说,它更适合于读多写少的场景

所以,如果是遍历删除的话,每次都会复制一个副本出来,占用内存极高,虽然代码满足,但内存消耗极高,考虑数据量和并发,此场景不适用

List<SysUsers> list = new CopyOnWriteArrayList();

 

posted @   了悟  阅读(2905)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示