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 

  • 相关阅读:
    Redis 集群搭建详细指南
    java 获取properties的几种方式
    redis主从,哨兵集群
    Nginx服务器之负载均衡策略
    Redis中常用命令
    Java中使用Jedis操作Redis
    redis学习教程网站
    Redis 数据备份与恢复
    CentOS6.5 在线安装Redis5.0.9
    nginx中文学习网站(推荐)
  • 原文地址:https://www.cnblogs.com/fanBlog/p/9755418.html
Copyright © 2011-2022 走看看