网上的hashmap冲突太长,太复杂,看的脑仁疼,自己随便总结下,有不同意的请指正
代码如下
do {
Entry<K,V> next = e.next; // <–假设线程一执行到这里就被调度挂起了
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
} while (e != null);
如图
hashmap结构为数组加链表,数组是竖的这一列,链表为横的这排
线程1 执行到代码所示位置 挂起
线程2 执行结束,用的头插法,所以next在e的前面,next指向e
然后线程1继续执行,此时e被变了吗?没有变,是线程栈里的变量
重新插入,头插法,将e插到next前面,这时e又指向next,好,循环指针形成
附:看的脑仁疼的链接
版权声明:本文为xiaoe3504xiaoe原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。