hashmap在1.7及之前,為了性能考慮采用頭插法,如果在擴(kuò)容過程中出現(xiàn)多線程并行運(yùn)行,可能會(huì)產(chǎn)生循環(huán)鏈表。正常單線程擴(kuò)容如下:

正常擴(kuò)容.jpg
多線程并發(fā)擴(kuò)容,滿足特定條件會(huì)出現(xiàn)循環(huán)鏈表如下:

并發(fā)擴(kuò)容.jpg
如果此時(shí)再使用11,15等數(shù)值進(jìn)行查詢,會(huì)陷入循環(huán)鏈表無法找到出口指針而陷入死循環(huán),進(jìn)而導(dǎo)致CPU占用率100%的情況。
hashmap在1.8之后,采用了尾插法(如果鏈表過長(zhǎng)會(huì)轉(zhuǎn)為紅黑樹提升查詢性能),同時(shí)在尾插法使用過程中head和tail記錄頭尾節(jié)點(diǎn)避免出現(xiàn)循環(huán)鏈表的情況。