1.7HashMap多线程环境成环路的示意图
2019-12-30 10:06:38 14 举报
1.7HashMap多线程环境成环路示意图
作者其他创作
大纲/内容
由于下一个结点为K1,将执行下次while循环3,此次循环局部变量分别为:e=K1next = nulle.next = newTable[i] = K2(即K1.next= K2)newTable[i] = e = K1最后一个语句e = next = null ,将跳出循环
线程B的newTable
K1
线程A的newTable
1
3K3
2
0
线程A继续while循环1,此次循环的局部变量分别为:e=K1next=K2继续执行e.next = newTable[i]=null(即K1.next=null)newTable[i]=e=K1最后一个语句e=next,将K2作为下次while循环的结点
3
null
线程A在执行完transfer后,newTable里面的值是K1<->K2(环路),K3缺失了,接下来继续执行resize方法,table = newTable 。会将newTable赋值给HashMap的成员变量table下一次有调用到循环链表的方法,并且用到当前链表的时候,将会造成死循环。如get方法依赖的getEntry方法,就会循环遍历链表,将造成死循环。
注意(重要):newTable是局部变量,共享变量是在table里面的Entry
阶段5:线程A继续执行阶段(while循环2)
假设刚好hash取模后,三个结点的下标还是同一个。线程B完成正常的值转移,并在resize方法中将table设置为其转移完成的newTable。然后线程B执行完毕后,正常销毁。
K2
阶段4:线程A继续执行阶段(while循环1)
阶段1:待扩容阶段
在while循环1的时候,执行到Entry next=e.next此时next=K2e=K1线程会将这些变量暂存
阶段2:线程A第一次执行阶段
由于下一个结点为K2,将执行下次while循环2,此次循环局部变量分别为:e=K2next = K1 (由于线程B将K2的next指向了K1)e.next = newTable[i] = K1(即K2.next= K1)newTable[i] = e = K2最后一个语句e = next = K1 ,将K1 又作为下次while循环的结点
K3
3K1
1.7HashMap源码分析博客:https://blog.csdn.net/aidaowuqiong/article/details/103492264
1K1
阶段6:线程A继续执行阶段(while循环3)
阶段3:线程B执行阶段
0 条评论
回复 删除
下一页