错误信息如下
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);
}
为了维护抄袭成风的网络环境
严谨任何形式的转载