线程安全的集合处理报错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<IoSession> sessionList = new Vector<>();

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

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

源码如下:
在这里插入图片描述

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

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

List<String> list = Collections.synchronizedList(new ArrayList<>());
List<String> 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);
}

为了维护抄袭成风的网络环境
严谨任何形式的转载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值