美文网首页
多线程HashMap可能存在的死循环问题

多线程HashMap可能存在的死循环问题

作者: dwwl | 来源:发表于2019-11-13 16:00 被阅读0次

    HashMap多线程情况下可能会出现的问题:

    参考blog: https://my.oschina.net/xianggao/blog/393990

    虽然后面的图看不懂qwq,但是自己理解比后面图简单的多

    文中的代码应该是JDK8之前的代码

    void transfer(Entry[] newTable) {
        Entry[] src = table;
        int newCapacity = newTable.length;
        for (int j = 0; j < src.length; j++) {
            Entry e = src[j];
            if (e != null) {
                src[j] = null;
                do {
                    Entry next = e.next;
                    int i = indexFor(e.hash, newCapacity);
                    e.next = newTable[i];
                    newTable[i] = e;
                    e = next;
                } while (e != null);
            }
        }
    }
    

    上述代码在多线程下会出现问题的,

    142929_Vawr_120166.jpg

    上图演示了hashMap扩容的过程(这里的reHash() 简单成 key.hashCode()对扩容后数组长度取余)

    假设:两个线程同时进行扩容时,假设线程一在Entry<K,V> next = e.next;执行后挂起,而此时线程二已经完成扩容,

    第一次执行do while中的程序时,key:3的entry的next指向了key:7的entry,因为现在操作的是线程二已经扩容后的。

    在假设的情况下,next已经是key:7的entry了。所以第二次执行的时候,e是key:7的entry,而经过线程二的扩容操作后,key:7的entry的next是key:3的entry,所以现在就造成了死循环

    相关文章

      网友评论

          本文标题:多线程HashMap可能存在的死循环问题

          本文链接:https://www.haomeiwen.com/subject/kitkictx.html