@扩容形成环形链表死循环问题分析
场景
我们知道jdk1.7 hashmap的底层数据结构为hashtable加链表构成的,put操作时会是头插入法,并且还涉及扩容,单线程下这个是没有问题,现在场景出在多线程时,那么这个扩容resize是会出现问题的,咱们现在针对这个问题去查看扩容的源码来分析一下为什么会出现这个问题?
源码分析
这里就是resize方法实际上扩容和entry的转移是在transfer方法里面进行,下面我们直接进入transfer方法
现在假设有2个线程,即线程t1和线程t2执行这个扩容方法,我们针对这一场景进行源码分析,为容易理解配以图来表示。
1.假设扩容前的hashmap为如图所示,hashtable长度为2,此时有一个Entry节点{k3,v3}挂在hashtable的槽位1上面
- 假如此时有2个线程t1,t2同时对该hashmap进行put操作,假设线程t1put {k1,v1},线程t2put{k2,v2},