重识HashMap(三)
作者:互联网
面试官:HashMap多线程安全么?不安全,为啥不安全?
上一期我们看了HashMap#put方法的执行过程,通过源码很容易找出个答案回怼面试官,看下图。
当两个线程A,B同时拿到modCount同时进行逻辑操作时,就会导致结果不正确。这点好理解。比如A,B线程同时拿到modCount=10,++操作结束后modCount=11,实际应该是12。
还有吗?
有。
再看下这两行代码:
这里会产生数据覆盖的问题。正常情况下,当key的hash值算出来落到同一个i位置时,会产生链表,但在多线程情况下,假定线程A,B的key计算出来的hash值同时落到i=3的位置,而恰好i=3位置没有任何节点元素,那线程A,B将同时在table[3]位置创建Node节点。最终哪个会真正关联上呢?不得而知。
那如何解决呢?
首先,阿雷觉得这不是解决不解决的问题,而是不应该发生的问题,既然都知道HashMap在多线程环境下面不安全了,为啥还要用嘞。(也许你会说,我怎么知道,我来之前代码就这么写的了)。
解决思路:
1,换了吧,ConcurrentHashMap。
2,put操作时加个锁,像
Collections.synchronizedMap(map).get("key");//实现逻辑如下:
总结:这几天从第一节讲HashMap中主要的一些常量的意义,到put方法的执行逻辑,最后再解释线程不安全原因。算是对HashMap有一些更深刻的认知了吧(通俗地说就是以后可以拿出去吹水)。关于HashMap的内容暂时告一段落吧。学海无涯,唯勤是岸。我是阿雷,一个努力coding的程序员。
标签:重识,HashMap,modCount,线程,key,put,多线程 来源: https://blog.csdn.net/qq_26796255/article/details/117856101