jdk1.7HashMap并发扩容发生死循环源码详解

本文详细分析了Java 1.7 HashMap在并发扩容时可能出现死循环的问题。在扩容过程中,由于头插法和全局变量next的使用,可能导致链表形成环形结构,进而引发CPU飙升。在多线程环境下,两个线程同时进行扩容操作,由于数据结构的变化,可能导致后续get操作进入无限循环。理解这个问题有助于避免在并发环境下使用HashMap时出现性能问题。
摘要由CSDN通过智能技术生成

简介

HashMap是开发中常用的一种无序、线程不安全的集合。在Java1.7中hashMap采用的是数组加链表的结构来存储数据(1.8中增加了红黑树,主要是为了增加遍历查询效率,时间复杂度O(Logn),链表时间时间复杂度O(n)),每一个hashMap都会维护一个table[],类型为Entry<k,v> ,通过键值对来存储具体的k,v数据,Entry实际上是一个单向链表结构,维护了一个next指针,来解决hash碰撞问题,因为HashMap是按照Key的hash值来计算Entry在HashMap中存储的位置的,如果hash值相同,而key内容不相等,那么就用链表来解决这种hash冲突。jdk1.7的hashMap源码还是比较简单的,感兴趣的同学可以自己去研究下,到了jdk1.8中代码逻辑稍微复杂下,想研究jdk1.8 hashMap源码可以参考我另一篇文章,详细的介绍了1.8中hashMap源码原理。今天主要跟大家一起分析下1.7中hashMap并发扩容下可能造成死循环的问题。

代码分析

1.7中hashMap的put()方法逻辑还是不复杂的 ,感兴趣的自己可以研究下,我们直接找到hashMap扩容关键方法transfer()去研究分析。
在这里插入图片描述
通过源码可以清晰的看出在jdk1.7中transfer()方法主要是遍历我们的table数组,获取到每个index中的Entry链表,内层循环,遍历链表中的每一个ent

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值