关于HashMap线程不安全

  简单来说就是HashMap(它的线程不安全)在并发情况下会引起死循环,在多线程下,HashMap的put方法会导致它的Entry链表形成环形数据结构,在下次查询时就在陷入死循环(使用的是头插法)。纠其主要原因是当插入元素需要扩容时,会调用put方法->addEntry方法->resize方法->transfer方法,transfer是引起死循环的主要原因。详细介绍:https://www.cnblogs.com/wfq9330/p/9023892.html

  JDK1.8之前,为了提高rehash的速度,冲突链表是使用头插法,因为头插法是操作速度最快的,找到数组位置就直接找到插入位置了,头插法在多线程下回引起死循环

  JDK1.8之后开始加入红黑树,当链表长度大于8时链表就会转换成红黑树,这样就大大提高了在冲突链表查找的速度,同时因为链表的长度不可能大于8,链表在rehash的消耗就小很多,所以JDK1.8使用尾插法也避免了死循环问题

posted @ 2020-10-23 12:06  小智智  阅读(160)  评论(0)    收藏  举报