JDK1.7HashMap 头插法导致循环链表 死循环
2022-10-29 15:14:51 0 举报
JDK1.7HashMap 头插法导致循环链表 死循环
作者其他创作
大纲/内容
2
K2
table=线程B的newTable
0K1
3
线程A的newTable
阶段5:线程A继续while循环(第2遍)
0
1
K1
阶段6:线程A继续while循环(第3遍)
2K3
阶段2:线程A进入transfer
K3
线程A进入transfer的while循环,在第598行卡住
线程A走完transfer和resize之后,会将有环的newTable赋值给全局table,在调用get方法时调用getEntry时for循环发生死循环
此时:e=K1,next=K2
此时:e=K1,next=e.next=nulle.next = K1.next = newTable[i] = K2; newTable[i] = e = K1; e = next = null
阶段3:线程B走完transfer
假设线程B刚好完成transfer并在resize方法中将共享变量table改为自己transfer出来的newTable
此时:e=K1,next=K2e.next = newTable[i] = null; newTable[i] = e = K1; e = next = K2; 从K2进入下次循环
阶段1:待扩容数组
null
阶段4:线程A继续while循环(第1遍)
此时:e=K2,next=e.next=K1e.next = K2.next = newTable[i] = K1; newTable[i] = e = K2; e = next = K1; 从K1进入下次循环
HashMap原理可以参考博客:https://taylorluo.github.io/2022/10/25/Java%E5%9F%BA%E7%A1%80-%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6-5%E3%80%81HashMap/
0 条评论
下一页