栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

线程安全的集合处理报错java.util.ConcurrentModificationException

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

线程安全的集合处理报错java.util.ConcurrentModificationException

错误信息如下

java.util.ConcurrentModificationException
at java.util.Vector I t r . c h e c k F o r C o m o d i f i c a t i o n ( V e c t o r . j a v a : 1184 ) a t j a v a . u t i l . V e c t o r Itr.checkForComodification(Vector.java:1184) at java.util.Vector Itr.checkForComodification(Vector.java:1184)atjava.util.VectorItr.next(Vector.java:1137)

先说背景,我这边需要记录多个直连协议通道,于是我选择了vector

private List sessionList = new Vector<>();

在我使用Iterator遍历协议通道集合时,在.next()方法位置报错。经过分析,我发现vector类的.next()会校验Iterator大小与原始集合大小是否一致,如果不一致就会抛出上述异常。

也就是说如果在别的地方你有新增或者删除元素的操作,遍历就会报错。

源码如下:

造成这个的具体原因就是我在别的地方会对sessionList中的无效数据进行remove操作。

然后我就试了另外两种实现方式,Collections.synchronizedList 和 CopyOnWriteArrayList

List list = Collections.synchronizedList(new ArrayList<>());
List list = new CopyOnWriteArrayList<>();

发现Collections.synchronizedList也会出现相同问题,而CopyOnWriteArrayList则不会。

解决方案

1、所以如果你使用的是Vector或者Collections.synchronizedList,改成CopyOnWriteArrayList即可。
2、如果你只是遍历,没有删除、新增操作,建议使用foreach;如果有删除、新增操作,可以使用for循环,如下

for (int i = 0 ; i < list.size() ; i++){
    list.remove(i);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1032715.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号