当前位置: 首页 > news >正文

西安手机网站制作公司莱芜租房网站

西安手机网站制作公司,莱芜租房网站,如何做自己的淘宝优惠券网站,阿里云的网站模版好吗为什么HashMap 头插法会造成死锁? 本文参考 https://www.cnblogs.com/vipstone/p/15816345.html 在该文章基础上,进行了进一步的扩容和迭代 死循环执行步骤1 死循环是因为并发 HashMap 扩容导致的,并发扩容的第一步,线程 T1 和线…

为什么HashMap 头插法会造成死锁?

本文参考 https://www.cnblogs.com/vipstone/p/15816345.html
在该文章基础上,进行了进一步的扩容和迭代

死循环执行步骤1

死循环是因为并发 HashMap 扩容导致的,并发扩容的第一步,线程 T1 和线程 T2 要对 HashMap 进行扩容操作,此时 T1 和 T2 指向的是链表的头结点元素 A,而 T1 和 T2 的下一个节点,也就是 T1.next 和 T2.next 指向的是 B 节点,如下图所示: image.png

死循环执行步骤2

死循环的第二步操作是,线程 T2 时间片用完进入休眠状态,而线程 T1 开始执行扩容操作,一直到线程 T1 扩容完成后,线程 T2 才被唤醒,扩容之后的场景如下图所示: image.png 从上图可知线程 T1 执行之后,因为是头插法,所以 HashMap 的顺序已经发生了改变,但线程 T2 对于发生的一切是不可知的,所以它的指向元素依然没变,如上图展示的那样,T2 指向的是 A 元素,T2.next 指向的节点是 B 元素。

死循环执行步骤3

当线程 T1 执行完,而线程 T2 恢复执行时,死循环就建立了,如下图所示: image.png 因为 T1 执行完扩容之后 B 节点的下一个节点是 A,而 T2 线程指向的首节点是 A,第二个节点是 B,这个顺序刚好和 T1 扩完容完之后的节点顺序是相反的。T1 执行完之后的顺序是 B 到 A,而 T2 的顺序是 A 到 B,这样 A 节点和 B 节点就形成死循环了,这就是 HashMap 死循环导致的原因。

继续进行扩容后会变成以下:(1 --c ; 2 – b ; a – 3 ) ; 根据源码 C 永远进入不了table; 扩容后会一直陷入一个BA 的死循环

image-20250315193607220

底层源码

/*** 将所有Entry从当前表转移到newTable。*/
void transfer(Entry[] newTable, boolean rehash) {int newCapacity = newTable.length; //容量for (Entry<K,V> e : table) { //遍历table[1,2,3,4,5]while(null != e) { //遍历table中的链表table[i]Entry<K,V> next = e.next; // 1线程在跑,2线程没有跑if (rehash) { //如果是重新Hash,则需要重新计算hash值e.hash = null == e.key ? 0 : hash(e.key);}int i = indexFor(e.hash, newCapacity); //定位Hash桶//元素连接到桶中,这里相当于单链表的插入,总是插入在最前面,指针指向他下面的一个元素e.next = newTable[i];//newTable[i]的值总是最新插入的值newTable[i] = e;//继续下一个元素e = next;}}
}
解决方案

HashMap 死循环的常用解决方案有以下几个:

  1. 升级到高版本 JDK(JDK 1.8 以上),高版本 JDK 使用的是尾插法插入新元素的,所以不会产生死循环的问题;
  2. 使用线程安全容器 ConcurrentHashMap 替代(推荐使用此方案);
  3. 使用线程安全容器 Hashtable 替代(性能低,不建议使用);
  4. 使用 synchronized 或 Lock 加锁 HashMap 之后,再进行操作,相当于多线程排队执行(比较麻烦,也不建议使用)。
http://www.dtcms.com/a/527229.html

相关文章:

  • 广东建设信息网是什么网站天猫商城入驻
  • 莆田网站制作企业网站开发的经费预算
  • 品牌网站建设营销型网站设计wordpress 菜单保存在哪里
  • 做网站需要开放哪些端口中国建设项目招标网站
  • 营销型网站建设思路自己做网站传视屏
  • 做网站中app客户端wordpress如何精简导航代码
  • 企业建设网站管理制度广告制作技术培训
  • 网站建设内部风险分析企业品牌推广的核心目的是
  • 山西响应式网站建设哪家有购物网站策划案
  • 如何做网站霸屏重庆网站icp备案查询
  • 网站策划书的撰写流程网站开发连接数据库的方法
  • 佛山网站建设shundeit哈尔滨市建筑工程有限公司
  • 网站建设 官网广东网站建设发信息
  • seo sem 做网站影视公司注册流程及费用
  • 密云住房和城乡建设部网站首页建站公司转型做什么业务
  • 网站 关键字小说网站开发的看书软件
  • 子域名网站二级洛阳做家教去什么网站
  • 阳江网站制作建网站的基本流程
  • 男女做爰视频免费网站网站建设 排名宝下拉
  • 宁夏自治区建设厅网站网络空间 网站 域名
  • 网站前端设计图建设网站方法
  • 建设厅网站企业诚信分值网站如何不需要备案
  • 谁有人跟动物做的网站常州网站建设公司咨询
  • 成都网站搭建公司哪家好赤峰做网站多少钱
  • 毕业设计选择做网站的意义麦包包的网站建设
  • 福州如何做百度的网站怎么查找关键词排名
  • 智慧团登录官方网站铁岭网站开发
  • 西安学网站开发哪边好做企业网站时需要注意哪些地方
  • 北京网站建设价格天甘肃网站建设选哪家
  • 手机网站怎么做才适合优化wordpress仿小程序