HashMap遇见多线程的一大坑

Posted koala1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HashMap遇见多线程的一大坑相关的知识,希望对你有一定的参考价值。

前人总是说,HashMap不是线程安全的,不能用于多线程,对此的理解也仅仅是停留在这一句话上,不真正的遇见问题并解决它,永远不会记忆多深刻,正所谓实践是检验真理的唯一标准嘛。

遇见的线上问题,逻辑:从其他系统获取的分类数据(每类有唯一标识,内容为list),多线程处理分类数据后放入map,方法返回map类型的数据,在外部进行调用,方法使用了spring的caffine进行缓存处理(spring的caffine);代码如下:

    

页面现象:客户端页面刷新,部分数据有时能出来有时出不来

日志现象:每次最终map返回的数据不一样,第一个方法为请求的第三方系统数据

原因:观察日志排查问题,注意代码的第148行,array.parallelStream()操作为jdk8的lambda操作,其中parallelStream()为并发操作,单线程操作为Stream(),在HashMap为线程非安全的情况下,并发操作容易导致map数据错乱甚至结构毁坏

修复:parallelStream()改为Stream(),或者使用ConcurrentHashMap线程安全的map,结果一片和谐美好。

都怪当初刚接触了jdk8的lambda,没有了解清楚就在代码中随意使用,万幸出问题的地方不是重点页面。



以上是关于HashMap遇见多线程的一大坑的主要内容,如果未能解决你的问题,请参考以下文章

C++11多线程第三篇:线程传参详解,detach()大坑,成员函数做线程参数

hashmap多线程不安全的原因

多线程--一不小心遇见你

HashMap为什么是线程不安全的?

多线程下HashMap的死循环问题

多线程下HashMap的死循环问题