开发者社区> 问答> 正文

ConcurrentHashMap 的 get 方法会出现存在但get返回 null 的怎么处理?

已解决

ConcurrentHashMap 的 get 方法会出现存在但get返回 null 的情况嘛?(Java 8 及之后版本)

假如 ConcurrentHashMap 正在扩容,而有一个线程调用了 get() 方法,当 get() 方法在链表中遍历查找时,链表为 a1 -> a2 -> b1 -> b2 -> a3。

假设我们要查找的为 a3, 此时遍历到 b1 时, 扩容导致 b1 -> b2 移到了新的位置,a1 -> a2 -> a3 留在了原位置,那么此 get() 方法会返回 null嘛? 但原本 hashMap 中是存在 a3 的。

展开
收起
我是小美女 2021-10-20 20:12:45 1170 0
1 条回答
写回答
取消 提交回答
  • 网络规划设计师、敏捷专家、CISP、ITSS服务经理、ACA全科目、ACP4项、ACE、CBP、CDSP、CZTP等。拥有 PRINCE2 Foundation/Practitioner、CCSK、ITIL、ISO27001、PMP等多项国际认证。 专利5+、期刊10+、知识产权师。核心期刊审稿人。
    采纳回答

    您好,不会的。HashMap的resize是copy&move,即它会复制当前的元素并移动到新的桶列表中,再将扩容完成的桶列表替换掉当前的桶列表。因此你取到的是某一刻桶列表的快照,而resize并不会影响这个快照,而modify操作如put/remove则有可能会改变它。

    2021-10-20 20:15:09
    赞同 1 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载