Java中的集合类——HashMap中的并发死链

  • ReHash过程
    • 正常的ReHash过程:
    • 并发的Rehash过程
  • 解决办法

ReHash过程

正常的ReHash过程:

并发的Rehash过程

(1)假设我们有两个线程。我用红色和浅蓝色标注了一下。我们再回头看一下我们的 transfer代码中的这个细节:

do {Entry<K,V> next = e.next; // <--假设线程一执行到这里就被调度挂起了int i = indexFor(e.hash, newCapacity);e.next = newTable[i];newTable[i] = e;e = next;
} while (e != null);

而我们的线程二执行完成了。于是我们有下面的这个样子。

注意:因为Thread1的 e 指向了key(3),而next指向了key(7),其在线程二rehash后,指向了线程二重组后的链表。我们可以看到链表的顺序被反转后。
(2)线程一被调度回来执行:
先是执行 newTalbe[i] = e。
然后是e = next,导致了e指向了key(7)。
而下一次循环的next = e.next导致了next指向了key(3)。

(3)一切安好。
线程一接着工作。把key(7)摘下来,放到newTable[i]的第一个,然后把e和next往下移。

(4)环形链接出现。
e.next = newTable[i] 导致 key(3).next 指向了 key(7)。注意:此时的key(7).next 已经指向了key(3), 环形链表就这样出现了。

解决办法

(1)Hashtable替换HashMap
(2)Collections.synchronizedMap将HashMap包装起来
(3)ConcurrentHashMap替换HashMap

Java中的集合类——HashMap中的并发死链相关推荐

  1. [Java]JDK1.7中HashMap的并发死链

    [Java]JDK1.7中HashMap的并发死链 HashMap的并发死链现象发生在扩容时,在扩容过程中**transfer()**方法负责把旧的键值对转移到新的表中,其代码如下: void tra ...

  2. JDK1.7扩容时为什么会产生并发死链问题

    问题: 1.JDK1.7为啥为产生并发死链问题 并发,即多线程同时访问HashMap 需要知道的一些前提知识: 1. JDK1.7是采用有插法进行节点的添加的 2. HashMap的扩容长度为原来的一 ...

  3. 【java基础 12】HashMap中是如何形成环形链表的?

    导读:经过前面的博客总结,可以知道的是,HashMap是有一个一维数组和一个链表组成,从而得知,在解决冲突问题时,hashmap选择的是链地址法.为什么HashMap会用一个数组这链表组成,当时给出的 ...

  4. java.util.hashmap_java.util.HashMap中的无限循环

    我在这里经常有一些Vaadin代码阻塞,我不知道问题是什么: Thread 7892: (state = IN_JAVA) - java.util.HashMap.getEntry(java.lang ...

  5. 集合类 Java中的集合类解析和一些有深入的面试题

    Java集合类解析 List.Map.Set三个接口,存取元素时,各有什么特点? List 以特定次序来持有元素,可有重复元素.Set 无法拥有重复元素,内部排序.Map 保存key-value值,v ...

  6. 06-python中的集合类-01

    目录 06-python中的集合类-01 namedtuple 容器 创建 namedtuple namedtuple 的一些特点 为啥要有namedtuple 呢? defaultdict defa ...

  7. Java集合篇:HashMap原理详解(JDK1.7及之前的版本)

    (本文有关HashMap的源码都是基于JDK1.6的) 摘要: HashMap是Map族中最为常用的一种,也是 Java Collection Framework 的重要成员.本文首先给出了 Hash ...

  8. Java 基础知识总结—HashMap

    1.HashMap基本概念 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射.HashMap 的 key 与 value 类型可以相同也可以不同,可以是字符串(String ...

  9. 关于java的集合类,以及HashMap中Set的用法!

    來源:http://hi.baidu.com/fyears/blog/item/52329711622e007ccb80c465.html 关于java的集合类,以及HashMap中Set的用法! 2 ...

最新文章

  1. 解决jmeter测试报告不显示后面的断言错误失败信息
  2. java的ThreadLocal类的使用方法
  3. 互联网全域降维攻击战略概述
  4. mysqlreport的学习
  5. Docker创建一个镜像
  6. linux 踢出在线用户
  7. Codeforces Round #315 (Div. 1) A. Primes or Palindromes? 暴力
  8. Tensorflow 2.0 打印 Tensor
  9. digiKam 6.1.0 发布,相片管理工具
  10. excel线性拟合的斜率_excle指定斜率拟合 | 用Excel如何进行最小二乘法的线性拟合?求图解!...
  11. cholesky分解java代码,实数矩阵Cholesky分解算法的C++实现
  12. Agile PLM 表结构说明
  13. python字典的删除(简介明了)
  14. 华为中兴和中国政府可准备两项法律反击
  15. CAD中怎么画指北针?CAD画指北针教程
  16. 1. vue.js的快速入门使用
  17. python实现复旦大学选课系统自动抢课神器抢课软件Courcegoblin抢课软件ver 1.0
  18. java插入排序(含插入排序代码)
  19. 上海轨道交通运营网络换乘站时刻表
  20. Python中那些让人望而退步的花式打印

热门文章

  1. 亚马逊产品视频制作与关联视频设置技巧分享
  2. dig是什么意思 java_dig是什么意思_dig的翻译_音标_读音_用法_例句_爱词霸在线词典...
  3. Electron教程(四)使用 Vue Browser 版,创建小工具应用
  4. 如何发现我所爱?如何做我所爱?
  5. 女人,男人,... (转载)
  6. 第二十课:电感和RL电路
  7. 国人造「人镜分离望远镜」,手机大屏能拍照、能录像…500mm长焦距,月坑都能看清楚...千元入...
  8. 【51单片机】串口通信/LED点阵
  9. QTranslate翻译工具
  10. php导出excel2007实例,php导入导出excel实例