并发下HashMap头插会造成死循环情况说明

it2024-11-20  21

说明:

JDK1.8之前采用头插,即在链表结构上每次都把数据放在链表头部。JDK1.8采用尾插方法


并发头插死循环问题:

比如有两个线程同时进行rehash,要将链表进行重新排列 rehash前链表结构为:A --> B

线程1进行操作:遍历原链表,首先获得节点A,操作挂起,线程2进入。(线程1数据不会提交)线程2进行操作:遍历原链表,以头插方式遍历执行,执行完成 B – > A。(线程2数据未提交)线程1继续执行:遍历原链表,头插方式执行,完成 B – > A,此时线程2数据提交,线程1发现 B.next 不为null,继续遍历执行,又将B.next = A插入,形成A --> B – > A循环结构。

JDK1.8尾插为什么会避免这个问题,因为尾插每次操作,结点顺序都保持不变,自己画一下就知道了。


最新回复(0)