zoukankan      html  css  js  c++  java
  • java 基础 HashMap 并发扩容问题

     存入的数据过多的时候,尤其是需要扩容的时候,在并发情况下是很容易出现问题.

    resize函数:

    void resize(int newCapacity) {
            Entry[] oldTable = table;
            int oldCapacity = oldTable.length;
            if (oldCapacity == MAXIMUM_CAPACITY) {
                threshold = Integer.MAX_VALUE;
                return;
            }
     
            Entry[] newTable = new Entry[newCapacity];
            boolean oldAltHashing = useAltHashing;
            useAltHashing |= sun.misc.VM.isBooted() &&
                    (newCapacity >= Holder.ALTERNATIVE_HASHING_THRESHOLD);
            boolean rehash = oldAltHashing ^ useAltHashing;
            transfer(newTable, rehash);  //transfer函数的调用
            table = newTable;
            threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);
        }
    void transfer(Entry[] newTable, boolean rehash) {
            int newCapacity = newTable.length;
            for (Entry<K,V> e : table) { //这里才是问题出现的关键..
                while(null != e) {
                    Entry<K,V> next = e.next;  //寻找到下一个节点..
                    if (rehash) {
                        e.hash = null == e.key ? 0 : hash(e.key);
                    }
                    int i = indexFor(e.hash, newCapacity);  //重新获取hashcode
                    e.next = newTable[i];  
                    newTable[i] = e;
                    e = next;
                }
            }
        }

    并发导致死循环:

     

    https://blog.csdn.net/z69183787/article/details/64920074?locationNum=15&fps=1 

  • 相关阅读:
    Java_大数加法
    Java_找出最多的10个单词
    过滤文本敏感词
    JDK(Win10)下载与安装
    Agile PLM_统计物料消耗
    Java_扑克牌顺子
    Java8_stream_集合对象属性的合并
    Apache Maven下载与安装
    java泛型 无敌
    Java异常处理 无敌
  • 原文地址:https://www.cnblogs.com/fanBlog/p/9755418.html
Copyright © 2011-2022 走看看