HashMap死锁原因及替代方案

原文链接:http://blog.csdn.net/fhzaitian/article/details/51505516

------------------------------------------------------------------------

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可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优化mysql数据库_MySQL数据库十大优化技巧

WEB开发者不光要解决程序的效率问题&#xff0c;对数据库的快速访问和相应也是一个大问题。希望本文能对大家掌握MySQL优化技巧有所帮助。1. 优化你的MySQL查询缓存在MySQL服务器上进行查询&#xff0c;可以启用高速查询缓存。让数据库引擎在后台悄悄的处理是提高性能的最有效方…

跋山涉水——深入 Redis 字典遍历

Redis 字典的遍历过程逻辑比较复杂&#xff0c;互联网上对这一块的分析讲解非常少。我也花了不少时间对源码的细节进行了整理&#xff0c;将我个人对字典遍历逻辑的理解呈现给各位读者。也许读者们对字典的遍历过程有比我更好的理解&#xff0c;还请不吝指教。一边遍历一边修改…

linux下VI模式中上下左右键和回退键出现字母

原文地址&#xff1a;http://blog.csdn.net/u012860950/article/details/50127779 ---------------------------------------------------------------- 1.编辑/etc/vim/vimrc.tiny 由于/etc/vim/vimrc.tiny的拥有者是root用户&#xff0c;所以要在root的权限下对这个文件进行修…

mysql数据库查询优化建议_mysql数据库查询优化的24条建议

MySQL是一个强大的开源数据库。随着MySQL上的应用越来越多&#xff0c;MySQL逐渐遇到了瓶颈。这里提供一些关于Mysql 数据库查询优化的24条优化建议&#xff0c;仅供参考。Mysql 查询优化1、使用慢查询日志&#xff0c;找出执行慢的查询。2、使用 EXPLAIN 来决定查询功能是否合…

常规sql读取CLOB

plsql下&#xff0c;普通sqlsql-cmd下总结&#xff1a; 常规的sql&#xff0c;查询clob字段&#xff0c;只能显示部分内容。 查clob内容select dbms_lob.substr(c_content) from table_content t dbms_lob.substr将大文本转换字符类型读出来.dbms_lob.substr的转换对字段conten…

精解 ES6箭头函数

&#x1f431; 个人主页&#xff1a;SHOW科技&#xff0c;公众号&#xff1a;SHOW科技 &#x1f64b;‍♂️ 作者简介&#xff1a;2020参加工作&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;优质专栏&#x…

硬盘主引导记录详解

说明&#xff1a;硬盘主引导记录独立于操作系统&#xff0c;但又和操作系统息息相关——很多时候它又是由; 操作系统所提供的工具所生成&#xff08;例外的情况是您使用了其他的分区工具&#xff0c;不过它又运行在; 什么操作系统中呢&#xff1f;;(&#xff09;。;; 如果您安装…

Oracle char varchar varchar2 nvarchar2 的区别

上面字符类型能保存多少个字符与oracle当前的字符集有关系。 select userenv(language) from dual; 假设长度2000字节&#xff0c; 如果字符集是16位编码的&#xff0c;ZHS16GBK&#xff0c;那么每个字符16位&#xff0c;2字节&#xff0c;所以可以容纳1000字符。 如果是32位编…

树莓派lnmp安装mysql_在树莓派上安装 LNMP

树莓派支持安装非常多的操作系统&#xff0c;如官方所展示&#xff1a;这里我选择了推荐的 Raspbian 系统&#xff0c;它基于 Debian&#xff0c;这就意味着我可以按照 Debian 的方式来安装软件。一、安装 Nginx0、先将系统更新到最新状态$ sudo apt-get update && sud…

openlayers5之热力图heatmap

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/gisdoer/article/details/81745645 openlayers5之热力图 点击查看文章

maven项目在打war包时出现非法字符: '\ufeff' 解决方案

http://blog.csdn.net/qi_fei/article/details/61416319 --------------------------------------------问题描述&#xff1a; 开发工具MyEclipse 的总体开发环境&#xff0c;编码格式总体设置为UTF-8&#xff0c;在将web项目打包的时候出现&#xff1a;非法字符&#xff1a;\u…

0027-生成圆

题目 生成圆难度级别&#xff1a;A&#xff1b; 运行时间限制&#xff1a;1000ms&#xff1b; 运行空间限制&#xff1a;51200KB&#xff1b; 代码长度限制&#xff1a;2000000B 试题描述给你一些特殊的圆&#xff0c;每个这样的圆每秒可以产生一个普通的圆&#xff0c;如果给你…

mysql启多_MySQL启多个实例

很多朋友都想在一台服务器上运行多个MySQL Instance&#xff0c;究竟怎么做呢&#xff1f;首先要明晰几个原理&#xff0c; 简称为mysqld读取my.cnf的顺序&#xff1a;第一搜&#xff0c;首先读取/etc/my.cnf&#xff0c;多实例这个配置文件不会存在。&#xff1a;-(第二搜&…

数据连接池druid 和 大数据框架druid

叫druid的有两个开源项目。 一个是&#xff1a;Druid是一个JDBC组件&#xff0c;它包括三部分&#xff1a; DruidDriver 代理Driver&#xff0c;能够提供基于Filter&#xff0d;Chain模式的插件体系。 DruidDataSource 高效可管理的数据库连接池。 SQLParser 另一个是&#xff…

零基础入门深度学习(5) - 循环神经网络

往期回顾 在前面的文章系列文章中&#xff0c;我们介绍了全连接神经网络和卷积神经网络&#xff0c;以及它们的训练和使用。他们都只能单独的取处理一个个的输入&#xff0c;前一个输入和后一个输入是完全没有关系的。但是&#xff0c;某些任务需要能够更好的处理序列的信息&am…

sql排名名次分页mysql_mysql 实现排名及中文排序实例[分页累加行号]

/*排名相同情况下&#xff0c;优先按姓名排序*/SELECT t.name, t.company_name, rownum:rownum1 as rankNum, t.ss from (SELECT u.name, sci.company_name, rownum:0,(u.check_numu.online_hours) as ss FROM v_user uLEFT JOIN sys_company_info sci ON u.companyId sci.com…

世上最简单的mysql_史上最简单安装MySQL教程

1.安装MySQL很多都推荐在MySQL官网进行安装,我刚开始试的时候官网下载zip文件,打开完全找不到,踩坑了后面我发现了Windows简易安装,俗称傻子都会安装安装好了就会看到一个这个文件安装之前首先你的有没有这个你就无法安装,这个可以去这里进行下载安装好了就可以安装MySQL了因为…

linux下ftp配置文件详解

# 匿名用户配置 anonymous_enableYES # 是否允许匿名ftp,如否则选择NO anon_upload_enableYES # 匿名用户是否能上传 anon_mkdir_write_enableYES # 匿名用户是否能创建目录 anon_other_write_enableYES # 修改文件名和删除文件 # 本地用户配置 …

Eclipse Maven 编译错误 Dynamic Web Module 3.0 requires Java 1.6 or newer 解决方法

eclipse maven 项目报 Description Resource Path Location TypeDynamic Web Module 3.0 requires Java 1.6 or newer. bdp line 1 Maven Java EE Configuration ProblemDescription Resource Path Location Type One or more constraints have not been satisfied. bdp line 1…

帆软按钮控件变查询_帆软报表(多sheet)自定义分页查询

三、添加自定义按钮以及JS事件1、打开‘模板Web属性’2、选中‘填报页面设置’&#xff0c;修改2)为‘为模板单独设置‘&#xff0c;3)中是前面七个是添加的自定义按钮&#xff1b;通过4)按钮进行设置&#xff1b;5)操作是添加‘加载结束’事件&#xff1b;接下来详细讲述每个步…