hashmap是非线程安全的,多线程环境下请使用ConcurrentHashMap或者其他线程安全的map。

遇到ConcurrentModificationException错误。

一、问题情景

多线程环境下使用hashmap,使用中途进行map的增减,导致出现ConcurrentModificationException错误。

二、尝试解决

我一开始使用keyset进行遍历:

后来改用了iterator进行遍历,依旧报错。基本上判定不是遍历方式出错,而是map自身的问题。

三、解决方法

不使用hashmap,使用线程安全的ConcurrentSkipListMap。

这样就不会报错了。

四、错误原因

可以看到hashmap中的存在对modCount的校验(操作数,用于保证数据没有被中途改变)。

因为hashmap是非线程安全的,如果使用中途多条线程都对map进行操作,modCount就可能被改变,导致抛出ConcurrentModificationException错误。

五、总结

需要清楚hashmap的原理,为什么线程不安全。

发表评论

电子邮件地址不会被公开。 必填项已用*标注