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