JDK1.7HashMap环链的造成原理(附图)

HashMap在1.8相对1.7作了不少改进,好比红黑树,还有今天要说的环链的造成,以前看别人博客只是说到了1.7版本HashMap在扩容的时候会造成环链,可是没有说到具体缘由。安全

这是jdk1.7中HashMap扩容的源代码,咱们的分析也是从这开始的。HashMap是线程不安全的,假如此时有二个线程Thread-1和Thread-2同时进入到这个扩容方法,可是这个时候Thread-2阻塞住了,也就是卡在这没有往下执行。Thrwad-1继续执行下去。

第二幅图文字我在这重复一下:可是这时候Thread-2苏醒了,此时的Thread-2遍历的仍是以前的那个old table,因此Thread-2来作第一次循环的时候第一个元素e的结构是{key=1,value=1,next=2},而后Thread-2把这个新的元素移到新的table上去,可是此时的newtable的结构以下线程

因此在执行e.next = newTable[i] = 2,这个时候这个元素的结构就变成{key=1,value=1,next=2},而后Thread-2把这个元素放到newTable上去,newTable的结构就会变成下面这样

这时候二个元素的下一个节点指向了对方,因此就形成了环链。3d

相关文章
相关标签/搜索