HashMap的循环引用

HashMap是非线程安全类,在java7多线程扩容机制下链表变成循环链表,出现循环引用问题。
解释:
1、HashMap的数据结构是 数组+链表结构。
2、扩容方式是 创建一个数组长度是原数组2倍的新数组。遍历原数组,将每个数组链表上的元素重哈希,通过头插法放入到对应的新数组位置上,遍历完后改变数组指针。
在多个线程检测到并进行扩容操作时,线程一在扩容到 准备将某个链表上的第一个元素k1移到新数组时挂起,此时有两个局部变量,第一个变量e指向k1,第二个变量next指向k1的下一个元素k2;然后线程二使用头插法完成扩容操作,此时k2的下一个元素正好是k1并且在同一个链表上。注意在线程一中next指向的是k2,而实际上k2此时是k1的前一个元素。继续线程一的扩容将k1放入到新数组中,在将k2放入到新数组,而后放入到新数组中的元素又是k1。这样就形成了死循环。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值