前言:
HashMap的底层是数组加链表的形式实现,是线程不安全的,在jdk1.7之前put都是采用的头插法,但是使用头插法在多线程的环境下是有可能导致死循环,所以在jdk1.8就将put方法改成了尾插法。
1.产生死循环的原因:
下面通过图解来解释:(jdk1.7:头插法:顺序:C,B,A)
通过扩容操作原本A-B-C的链表结构变成C-B-A。
2.解决方式:
通过synchronized(加锁)的方式来解决,但是不可避免在多线程环境下会产生阻塞,从而导致效率,速度都降低(开发中不允许出现,迫不得己的方式)。
在jdk1.8中提供了解决方式:将头插法改成尾插法,在这个过程势必会涉及到遍历链表(不如头插法快,但是HashTable中由于线程是安全的,所以还是使用的头插法),降低效率。