HashMap 为什么线程不安全?

HashMap 为什么线程不安全?

  1. 多线程下扩容死循环。JDK1.7 中的 HashMap 使用头插法插入元素,在多线程的环境下,扩容的时候有可能导致环形链表的出现,形成死循环。因此,JDK1.8 使用尾插法插入元素,在扩容时会保持链表元素原本的顺序,不会出现环形链表的问题。
  2. 多线程的put可能导致元素的丢失。多线程同时执行 put 操作,如果计算出来的索引位置是相同的,那会造成前一个 key 被后一个 key 覆盖,从而导致元素的丢失。此问题在JDK 1.7和 JDK 1.8 中都存在。
  3. put和get并发时,可能导致get为null。线程1执行put时,因为元素个数超出threshold而导致rehash,线程2 此时执行get,有可能导致这个问题。此问题在JDK 1.7和 JDK 1.8 中都存在。

你可能感兴趣的:(集合,java,开发语言,集合,HashMap)