JDK1.7版本下HashMap的死循环问题
原因:头插法、多线程情况下、内存不可见问题;
就拿两个线程来说,线程一和线程二同时执行完扩容,分别都生成了一个新的空数组,此时线程一的时间片用完,线程二完成哈希表的扩容以及数值的移动,但是线程一并不知道,所以线程一所操作的数都是在线程二已经完成扩容后的数组的前提下,在自己创的新数组中又进行了一次重复操作,使得出现循环引用的问题,详情看下图:
所以在JDK1.8的时候将头插法换成了尾插,但是虽然解决了死循环的问题,但是又出现了多线程情况下数据覆盖的问题,也是由于线程操作,另一个线程不可见,重复的去进行相同的操作造成的。