并发环境下hashmap头插法的问题
hashmap的头插法问题
无意当中了解了这个问题,hashmap的数据插入的时候分为头插法和尾插法,头插法在jdk1.8之前,尾插法在jdk1.8实现。
因为头插法会出现链表成环的问题,所以插入方式进行了改变,变为尾插法。即使链表成环,如果不在这个链表中查询也不会出现问题,即使查询,如果查询的不是环中的值,也不会出现问题,只有查询环中的值才会出现问题。
说明:hash值和插入数据仅作说明问题用,源码请参考其它博主的优秀文章。
例如次数要查询5并不会出现问题,但是查询hash值为2,但是value不再这个链表中的数据会出现问题,例如查询33(hash=2)就会出现死循环的问题。
那么这个链表是如何成环的?
必须是在多线程环境下,在一定的条件下才可能形成环路。
假设有两个线程,线程1和线程2,在插入数据后都要进行扩容操作,线程1先进行扩容操作。
此时线程1要进行 扩容操作,对hash=2的链表取出再放入新的链表的时候(假设链表中hash值依然相同),线程中断,此时只取得了e=5,next= 9;然后线程2执行。
线程2正常执行:
然后线程1继续执行,
此时,再继续执行的时候,原数据已经被线程2更改,所以会从新的、线程2更改后的数据中取值,此时,在hash=2这个桶中,e=9,next=5,继续执行,
执行到现在依然没有什么问题,继续执行,由线程2执行后的表可以,此时e=5,5.next=null ,线程1会进行本链表的最后一次插入操作,会将值插在链表的头部,
此时,在插入数值后,value5是指向value9的,所以会替换之前的value5指向null,这个地方是我看了好多文章之后的个人理解,仅供参考。
最终的表现形式:
并发环境下hashmap头插法的问题相关推荐
- 并发环境下HashMap引起的full gc排查
参考:http://ifeve.com/case-of-hashmap-in-concurrency/ http://ifeve.com/hashmap-infinite-loop/
- java 无锁缓存_如何在高并发环境下设计出无锁的数据库操作(Java版本)
一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...
- 如何在高并发环境下设计出无锁的数据库操作(Java版本) 转载
一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...
- 【高并发】高并发环境下构建缓存服务需要注意哪些问题?我和阿里P9聊了很久!...
写在前面 周末,跟阿里的一个朋友(去年晋升为P9了)聊了很久,聊的内容几乎全是技术,当然了,两个技术男聊得最多的话题当然就是技术了.从基础到架构,从算法到AI,无所不谈.中间又穿插着不少天马行空的想象 ...
- 高并发环境下如何优化Tomcat性能?看完我懂了!
来自:冰河技术 写在前面 Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢? Tomcat运行 ...
- 【高并发】在高并发环境下该如何构建应用级缓存?
来自:冰河技术 写在前面 随着我们的系统负载越来越高,系统的性能就会有所下降,此时,我们可以很自然地想到使用缓存来解决数据读写性能低下的问题.但是,立志成为资深架构师的你,是否能够在高并发环境下合理并 ...
- oom 如何避免 高并发_【高并发】高并发环境下如何防止Tomcat内存溢出?看完我懂了!!...
[高并发]高并发环境下如何防止Tomcat内存溢出?看完我懂了!! 发布时间:2020-04-19 00:47, 浏览次数:126 , 标签: Tomcat 写在前面 随着系统并发量越来越高,Tomc ...
- cache数据库和mysql_并发环境下,先操作数据库还是先操作缓存?
原标题:并发环境下,先操作数据库还是先操作缓存? 来源:捡田螺的小男孩 前言 在分布式系统中,缓存和数据库同时存在时,如果有写操作,先操作数据库还是先操作缓存呢?本文将分5种方案 展开阐述对比,谢谢阅 ...
- 高并发环境下,6个构建缓存服务需要注意的问题
摘要:高并发环境下如何构建缓存服务,你知道吗? 本文分享自华为云社区<[高并发]高并发环境下构建缓存服务需要注意哪些问题?>,作者:冰 河. 缓存特征 (1)命中率:命中数/(命中数+没有 ...
最新文章
- R语言Brown-Forsythe检验验证组间方差是否相等实战:执行Brown-Forsythe检验、如果各组间的方差不相等我们该怎么办(进行方差分析)
- 软件工程-第三次作业
- JAVA 通过URL 获取页面内容
- wxWidgets:wxHTML 概述
- c# 中通快递对接_快递共配是什么?行业前景怎么样?
- fcn从头开始_如何使用Go从头开始构建区块链
- 通过Server-U设置网络共享文件夹的步骤和注意事项
- Paros工具使用手册
- 【CS论坛】维护网络安全的四块基石
- PHP Mysql:时间函数
- Security+ 学习笔记11 应用程序攻击
- Cookie机制小记
- 免费微信小程序商城源代码,基于Uni-App,实现一码多端
- javascript animation lib greensock gsap介绍
- SoundPool概述
- CF1071C. Triple Flips
- html 查找页面内容,如何在html页面中实现查找功能
- Idea突然不停indexing的问题
- 啊哈算法 --对冒泡排序python写法
- 为什么游戏流畅需要60帧,而电影流畅只需要24帧?
热门文章
- 轻巧好用的开源 Redis 可视化工具
- 小猿圈讲解Linux常见的版本
- mysql数据库损坏修复方法(适用window、Linux系统vps云主机)
- (原创)Oracle10g客户端下载/安装
- APSIM练习 2:残留物覆盖对休耕期间土壤储水的影响
- serverlet 区别_JSP serverlet的区别及联系介绍
- 删除含有某个字符的文件
- CCC3.0学习笔记_SPAKE2+ Flow 流程
- 使用单元测试框架Pytest生成HTML测试报告及优化
- 绘制学习曲线——plot_learning_curve