• 在JDK1.7的时候,插入链表采用的是头插法,会先将一个需要迁移节点的next指向新位置,然后再将新位置设置成迁移节点。因此在多线程扩容的情况下,一个线程完成了两个节点的迁移,但是被调度到另一个还未完成的线程,就会出现循环链表的情况
  • 在JDK1.8,采用了尾插法,只需要遍历一个个节点,挂在tail节点的后面即可,即使迁移过程有并发情况,指针也最多被复制两次