HashMap并发安全问题
作者:互联网
HashMap resize操作部分源码
1 for (Entry<K,V> e : table) { 2 while(null != e) { //// 1、当前结点不为null 3 Entry<K,V> next = e.next;//// 2、获取 e.next,赋值给next暂存 4 if (rehash) { 5 e.hash = null == e.key ? 0 : hash(e.key); // 计算e的哈希值 6 } 7 int i = indexFor(e.hash, newCapacity); // 计算 e在新Entry[]中的位置i 8 e.next = newTable[i];//// 3、让e.next指向newTable[i]的头结点 9 newTable[i] = e;//// 4、让e作为newTable[i]的头结点。这里是倒叙插入,新的结点作为头结点,头插法 10 e = next;//// 5、让next作为oldTable[j]的头结点 11 } 12 }
HashMap正常情况下的resize
HashMap多线程resize,出现环(紫色是线程A,绿色是线程B)
标签:结点,hash,HashMap,安全,newTable,next,并发,null 来源: https://www.cnblogs.com/zedh/p/14416960.html