2020-04-22:谈谈你的看法JDK1.8下的HashMap在并发情况下链表成环的过程。(挖坑题)

jdk1.8下的hashmap采用的是尾插法不会有链表成环的问题。jdk1.7下采用的头插法会有链表成环的问题。

hashmap成环原因的代码出现在transfer代码中也就是扩容之后的数据迁移部分

首先获取新表的長度,之后遍历新表的每一个entry然后每个ertry中的链表,以反转的形式形成rehash之后的链表。

若当前线程此时获得ertry节点但是被线程中断无法继續执行,此时线程二进入transfer函数并把函数顺利执行,此时新表中的某个位置有了节点之后线程一获得执行权继续执行,因为并发transfer所以兩者都是扩容的同一个链表,当线程一执行到e.next = new table[i] 的时候由于线程二之前数据迁移的原因导致此时new table[i] 上就有ertry存在,所以线程一执行的时候会將next节点,设置为自己导致自己互相使用next引用对方,因此产生链表导致死循环。

jdk1.8下的hashmap采用的是尾插法不会有链表成环的问题。jdk1.7下采用的头插***有链表成环的问题

hashmap成环原因的代码出现在transfer代码中,也就是扩容之后的数据迁移部分

首先获取新表的长度の后遍历新表的每一个entry,然后每个ertry中的链表以反转的形式,形成rehash之后的链表

若当前线程此时获得ertry节点,但是被线程中断无法继续执行此时线程二进入transfer函数,并把函数顺利执行此时新表中的某个位置有了节点,之后线程一获得执行权继续执行因为并发transfer,所以两者都昰扩容的同一个链表当线程一执行到e.next = new table[i] 的时候,由于线程二之前数据迁移的原因导致此时new table[i] 上就有ertry存在所以线程一执行的时候,会将next节点设置为自己,导致自己互相使用next引用对方因此产生链表,导致死循环

jdk1.8下的hashmap采用的是尾插法不会有链表成环的问题。jdk1.7下采用的头插***有链表成环的问题

hashmap成环原因的代码出现在transfer代码中,也就是扩容之后的数据迁移部分

首先获取新表的长度の后遍历新表的每一个entry,然后每个ertry中的链表以反转的形式,形成rehash之后的链表

若当前线程此时获得ertry节点,但是被线程中断无法继续执行此时线程二进入transfer函数,并把函数顺利执行此时新表中的某个位置有了节点,之后线程一获得执行权继续执行因为并发transfer,所以两者都昰扩容的同一个链表当线程一执行到e.next = new table[i] 的时候,由于线程二之前数据迁移的原因导致此时new table[i] 上就有ertry存在所以线程一执行的时候,会将next节点设置为自己,导致自己互相使用next引用对方因此产生链表,导致死循环

我要回帖

更多关于 谈谈你的看法 的文章

 

随机推荐