多线程下jdk1.7的头插法导致的死循环问题
20250208
- 多线程下jdk1.7的头插法导致的死循环问题
多线程下jdk1.7的头插法导致的死循环问题
【新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题)】
jdk1.7在hashmap扩容时使用的是头插法,所以扩容后元素的顺序是相反的
在多线程情况下:
现在开始扩容,在扩容初始状态时,2个线程的e都指向了A,next都指向了B
之后线程2抢到了时间片,线程2开始对hashmap进行扩容:
线程2扩容完之后,因为数据迁移过程中只是改变了对象的引用,所以线程1的e依旧指向A,next依旧指向B
现在线程1开始扩容工作:
-
在第1次循环时,线程1会把e指向的A插入到线程1扩容后的数组上,之后因为要执行
e=next
,此时的next=B,所以第一次循环后e指向了B,next指向了A
-
在第2次循环时,线程1会把e指向的B插入到扩容后的数组上,之后继续执行
e=next
,此时的next=A,所以第二次循环后e指向了A,next指向了null
-
第3次循环时,线程1会把e指向的A再次插入到扩容后的数组上,之后继续执行
e=next
,此时的next=null,所以第二次循环后e指向了null
-
扩容结束,出现了多线程死循环
总结: