首先是無論JDK1.7還是1.8都會產生的不安全因素:
- put元素的時候,A線程對一個元素進行hash計算桶的索引坐標,然而正當它准備插入元素的時候,B線程被調度並且被完整執行,如果這個時候A和B線程獲得索引坐標是一樣的,那么B會插入元素形成新的鏈表,但是A線程拿到的舊鏈表信息,所以A線程執行完后會覆蓋B線程插入的元素。
另外,JDK1.7前是頭插法,1.8后變為了尾插法,這里頭插法會有一個安全隱患:

[3,A],[7,B]這兩個元素我簡化表示為A,B;問題就出現在擴容的時候:
- e = A A.next = B,這時候e為A,插在了index = 3 的位置,正准備插入B的時候(此時 e = B),另外的線程被調度且完整的完成了擴容操作,導致 B.next = A 這個時候原來的線程繼續完成擴容的操作,插入B,然后往后遍歷 e = B.next,然而引用信息已經被修改,B.next = A,所以該線程繼續頭插法插入A,A.next = B,如此便形成了一個環形鏈表,進入死循環。
