Java中的集合类——HashMap中的并发死链
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中的并发死链相关推荐
- [Java]JDK1.7中HashMap的并发死链
[Java]JDK1.7中HashMap的并发死链 HashMap的并发死链现象发生在扩容时,在扩容过程中**transfer()**方法负责把旧的键值对转移到新的表中,其代码如下: void tra ...
- JDK1.7扩容时为什么会产生并发死链问题
问题: 1.JDK1.7为啥为产生并发死链问题 并发,即多线程同时访问HashMap 需要知道的一些前提知识: 1. JDK1.7是采用有插法进行节点的添加的 2. HashMap的扩容长度为原来的一 ...
- 【java基础 12】HashMap中是如何形成环形链表的?
导读:经过前面的博客总结,可以知道的是,HashMap是有一个一维数组和一个链表组成,从而得知,在解决冲突问题时,hashmap选择的是链地址法.为什么HashMap会用一个数组这链表组成,当时给出的 ...
- java.util.hashmap_java.util.HashMap中的无限循环
我在这里经常有一些Vaadin代码阻塞,我不知道问题是什么: Thread 7892: (state = IN_JAVA) - java.util.HashMap.getEntry(java.lang ...
- 集合类 Java中的集合类解析和一些有深入的面试题
Java集合类解析 List.Map.Set三个接口,存取元素时,各有什么特点? List 以特定次序来持有元素,可有重复元素.Set 无法拥有重复元素,内部排序.Map 保存key-value值,v ...
- 06-python中的集合类-01
目录 06-python中的集合类-01 namedtuple 容器 创建 namedtuple namedtuple 的一些特点 为啥要有namedtuple 呢? defaultdict defa ...
- Java集合篇:HashMap原理详解(JDK1.7及之前的版本)
(本文有关HashMap的源码都是基于JDK1.6的) 摘要: HashMap是Map族中最为常用的一种,也是 Java Collection Framework 的重要成员.本文首先给出了 Hash ...
- Java 基础知识总结—HashMap
1.HashMap基本概念 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射.HashMap 的 key 与 value 类型可以相同也可以不同,可以是字符串(String ...
- 关于java的集合类,以及HashMap中Set的用法!
來源:http://hi.baidu.com/fyears/blog/item/52329711622e007ccb80c465.html 关于java的集合类,以及HashMap中Set的用法! 2 ...
最新文章
- 解决jmeter测试报告不显示后面的断言错误失败信息
- java的ThreadLocal类的使用方法
- 互联网全域降维攻击战略概述
- mysqlreport的学习
- Docker创建一个镜像
- linux 踢出在线用户
- Codeforces Round #315 (Div. 1) A. Primes or Palindromes? 暴力
- Tensorflow 2.0 打印 Tensor
- digiKam 6.1.0 发布,相片管理工具
- excel线性拟合的斜率_excle指定斜率拟合 | 用Excel如何进行最小二乘法的线性拟合?求图解!...
- cholesky分解java代码,实数矩阵Cholesky分解算法的C++实现
- Agile PLM 表结构说明
- python字典的删除(简介明了)
- 华为中兴和中国政府可准备两项法律反击
- CAD中怎么画指北针?CAD画指北针教程
- 1. vue.js的快速入门使用
- python实现复旦大学选课系统自动抢课神器抢课软件Courcegoblin抢课软件ver 1.0
- java插入排序(含插入排序代码)
- 上海轨道交通运营网络换乘站时刻表
- Python中那些让人望而退步的花式打印
热门文章
- 亚马逊产品视频制作与关联视频设置技巧分享
- dig是什么意思 java_dig是什么意思_dig的翻译_音标_读音_用法_例句_爱词霸在线词典...
- Electron教程(四)使用 Vue Browser 版,创建小工具应用
- 如何发现我所爱?如何做我所爱?
- 女人,男人,... (转载)
- 第二十课:电感和RL电路
- 国人造「人镜分离望远镜」,手机大屏能拍照、能录像…500mm长焦距,月坑都能看清楚...千元入...
- 【51单片机】串口通信/LED点阵
- QTranslate翻译工具
- php导出excel2007实例,php导入导出excel实例