HashMap死锁原因
1、首先我们需要简单地了解一下HashMap数据结构
HashMap通常会用一个指针数组(假设为table[])来做分散所有的key,当一个key被加入时,会通过Hash算
法通过key算出这个数组的下标i,然后就把这个<key, value>插到table[i]中,如果有两个不同的key被算了。
但有时候两个key算出的下标会是一个i,那么就叫冲突,又叫碰撞,这样会在table[i]上形成一个链表。所以
如果链表过多或过长,查找算法则会变成低性能的链表遍历,这是Hash表的缺陷。
我们都知道HashMap初始容量大小为16,一般来说,Hash表这个容器当有数据要插入时,都会检查容量有没有超过设定的thredhold,如果超过,需要增大Hash表的尺寸,但是这样一来,整个Hash表里的元素都需要被重算一遍。这叫rehash,这个成本相当的大。具体大家可以看看JDK源码
2、现在来讨论死锁产生的原因
HashMap是非线程安全,死锁一般都是产生于并发情况下。我们假设有二个进程T1、T2,HashMap容量为2,T1线程放入key A、B、C、D、E。在T1线程中A、B、C Hash值相同,于是形成一个链接,假设为A->C->B,而D、E Hash值不同,于是容量不足,需要新建一个更大尺寸的hash表,然后把数据从老的Hash表中
迁移到新的Hash表中(refresh)。这时T2进程闯进来了,T1暂时挂起,T2进程也准备放入新的key,这时也
发现容量不足,也refresh一把。refresh之后原来的链表结构假设为C->A,之后T1进程继续执行,链接结构
为A->C,这时就形成A.next=B,B.next=A的环形链表。一旦取值进入这个环形链表就会陷入死循环。
3、替代方案
使用ConcurrentHashMap进行替代,ConcurrentHashMap是一个线程安全的Hash Table。 可能有人会使用HashTable。当然HashTable也是线程安全,但HashTable锁定的是整个Hash表,效率相对比较低。而ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小。
HashMap死锁原因相关推荐
- HashMap死锁原因及替代方案
原文链接:http://blog.csdn.net/fhzaitian/article/details/51505516 --------------------------------------- ...
- 大厂面试爱问的HashMap死锁问题,看这一篇就够了
大厂面试爱问的HashMap死锁问题,看这一篇就够了 JDK 1.7 HashMap源码分析 put()方法 addEntry()方法 resize()方法 transfer()方法(重点) 死锁演示 ...
- Java多线程、高并发秒杀时MySQL出现死锁原因(Deadlock found when trying to get lock)及对应解决方案
1. 死锁背景 1.1 在做高并发秒杀中创建订单.减库存步骤时出现异常:MySQLTransactionRollbackException: Deadlock found when trying to ...
- mysql 死锁原因_Mysql并发时经典常见的死锁原因及解决方法
1.mysql都有什么锁 MySQL有三种锁的级别:页级.表级.行级. 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁:锁定粒 ...
- MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法
MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法 参考文章: (1)MySQL学习笔记(五)并发时经典常见的死锁原因及解决方法 (2)https://www.cnblogs.com/tiny ...
- C++(八)— 死锁原因及解决方法
C++(八)- 死锁原因及解决方法 参考文章: (1)C++(八)- 死锁原因及解决方法 (2)https://www.cnblogs.com/eilearn/p/9414962.html (3)ht ...
- 进程死锁原因及解决方法
进程死锁原因及解决方法 死锁的概念 死锁处理方法 死锁预防(静态策略) 死锁避免(动态策略) 银行家算法⭐ 死锁检测和解除 资源分配图 死锁解除 死锁的概念 死锁:指多个进程因竞争资源而造成的一种僵局 ...
- mysql 并发死锁_Mysql并发时经典常见的死锁原因
Mysql并发时经典常见的死锁原因 更新时间:2017-06-07 00:17:21 1256次阅读 评论 0 1.mysql都有什么锁 MySQL有三种锁的级别:页级.表级.行级. 表级锁:开销小, ...
- I2C死锁原因及解决方法
死锁总线表现为:SCL为高,SDA一直为低 现象:单片机采用硬件i2c读取E2PROM,当单片机复位时,会有概率出现再无法与E2PROM通信,此时SCL为高,SDA一直为低 原因:当单片机正在和E2P ...
最新文章
- C# 打好基础图文详解
- 框架开发与编程模式编程思想的结合
- 华为交换机VLAN Trunk模式设置
- localsandbox 如何响应tile点击事件
- Git Specification
- QT创建相应文件夹在指定目录下
- 基于JAVA+Servlet+JSP+MYSQL的学生选课管理系统
- Linux系统下的几种终端设备文件
- hdoj 4790 Just Random 【数学】
- java分页 添加序号_java 分页
- 学而思编程python软件下载-靠品牌还是靠实力?猿编程、学而思编程、网易卡搭等机构深度测评...
- 做个优秀的时间管理者
- 搭建 WordPress 博客教程
- 不只Keep、FITURE、乐刻,运动健身赛道近5年吸金633亿早已起飞
- SingleChildScrollView内容不超出屏幕时下拉回弹
- SVN服务器管理工具——VisualSVN Server Manager
- Java程序员学习Rust编程
- 虚拟机防火墙如何关闭
- java实现字符串中的中文繁简转换
- 五分钟,让你掌握学好CNC数控编程的技巧
热门文章
- 腾讯云接入备案流程 新手看过来
- 创业报告——在科技园和大学创业基地揭牌仪式上
- 李永身高一谈,主持人薪水谈
- OGG19 Oracle之间的同步(经典架构)
- 数据结构 【树状数组】【线段树】【珂朵莉树】
- WDA 表控件选择数据处理
- python schedule at_Python schedule 模块使用
- python数据容器之集合、字典
- 篮球下落过程c语言程序设计,英语翻译计算机基础及C语言程序设计 工程制图中国近代史纲要大学体育(排球)(篮球)(健美操)应用软件实践电路电路实验思想...
- MISCCCCCCCCCCCCCCCCCCCC