前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >HashMap源码解析(二)

HashMap源码解析(二)

作者头像
小土豆Yuki
发布2021-12-04 11:24:54
发布2021-12-04 11:24:54
27100
代码可运行
举报
文章被收录于专栏:洁癖是一只狗洁癖是一只狗
运行总次数:0
代码可运行

上一篇我们讲解了JDK1.7中的put,get源码,今天我们看看在多线中HashMap造成的如何引起死循环,先来看一下重要源码

代码语言:javascript
代码运行次数:0
复制
    void transfer(Entry[] newTable, boolean rehash) {
        int newCapacity = newTable.length;//新数组的大小
        for (Entry<K,V> e : table) {//遍历table 数组
            while(null != e) { //遍历数组元素对应的链表
                Entry<K,V> next = e.next;
                if (rehash) {//是否重新hash
                    e.hash = null == e.key ? 0 : hash(e.key);
                }
               //定位数组的下表
                int i = indexFor(e.hash, newCapacity);
                //这里就是头插法,把当前数据的下一个节点指向新数组的位置即newTable[i]
                e.next = newTable[i];
                //然后把当前元素复制newTable[i]
                newTable[i] = e;
                //继续下一个元素
                e = next;
            }
        }
    }

JDK1.7在扩容的时候,然后进行数据迁移,使用头插法,最终会导致死循环,首先我们看看什么是头插法,如下图

此时我们在来看看单线程中HashMap如何扩容

在我们了解单线程扩容之后,再来看看多线程如何引起死循环

此时就是JDK1.7多线程导致死循环的过程,认真品其中的过程,可以看到会可能导致数据丢失,下一节我们看JDK1.8源码

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 洁癖是一只狗 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档