ArrayList的java.util.ConcurrentModificationExceptio异常

发布于 2021-11-12  689 次阅读


项目中使用到了往Redis中存入消息,格式:<发送者名称,消息内容>

本来做的是每次往Redis中插入 一个消息对象,而这样的后果就是后写入的消息会覆盖前面的消息

 

比如第一条消息是 <橙汁,“你好”>

第二条消息是<橙汁,“嘿嘿嘿”>

这样的话只存入了第二条,第一条消息就丢失了,很明显这样不行

因此准备使用 存入消息列表的方式

例如<橙汁,<消息一,消息二...>>

 

因为每个客户端有一个对应的 readThread,而这个列表是在线程中,与其他的用户线程没用交集,所以我认为是线程安全的

而 Redis 写入也没有问题,但当我准备从 Redis 中取出数据的时候,发现抛出异常了

搜索了一下,大部分说是在删除的时候没有使用迭代器,也就是没有安全删除,详细解释可以搜索另一篇博文,Arraylist的安全删除

而我觉得最贴切的一句描述是

原因:执行了集合删除元素操作后进行集合元素操作,List,Set,Map迭代的时候是不允许自身长度改变的(无论是新增还是删除都需要修改list的长度)

解决:重新用一个集合处理

 

 

如图,没有对该列表进行输出的时候不报错,应证了上述说法

 

我的read线程在试图往arraylist里面新增数据,而这边又尝试读取,因此报错

 


她喜欢所以就做咯