网上的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,好,循环指针形成
附:看的脑仁疼的链接
https://www.cnblogs.com/lan-ge/p/10290169.html