多线程情况下使用hashMap下 ConcurrentModificationException的解决

问题的情况:公司在外网环境部署了多个不同类型设备,所以我写了一个服务开放不同端口出来设备类型接收外网设备收到的消息。

大概技术就是开放多个端口接收不同设备类型的消息,来对不同设备进行处理解析成不同数据存入数据库。一切都很好,但是过一段时间服务都会出现掉线的情况,报错如下。

在while读取iterator时 进入while 之后使用 String key = iterator.next();读取hashMap的key值

 

 解决思路:

  失败的方案:  最开始因为设备类型较少使用了阻塞式socket,所以最开始认为可能出现线程转换时将其他线程直接中断,所以把服务器接收socket改为非阻塞式的。

  再次尝试解决: 当我花费大力气将几个socket重写成新的非阻塞式的socket,认为不会出现新问题的时候问题。

  于是我将消息存储为一个volatile修饰的hashMap,并将类进行序列化。重新投入使用

  最后一次解决的方案是将volatile修饰的hashMap,去掉然后重新在synchronized将while读取socket接收处理的hashMap进行读取没有再出现问题了

 

posted @ 2021-08-30 10:04  CPPLC  阅读(207)  评论(0编辑  收藏  举报