重识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的程序员。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值