为何 HashMap 不是线程安全的

  • HashMap 是一个可变对象

  • HashMap 对象的内部具有多个成员变量,对象具备多种状态,并且内部并没有设置同步策略来控制状态的变化

  • 因为没有任何同步措施,HashMap 甚至不能保证内存可见性

在 JDK1.7 中,HashMap 采用头插法插入元素,因此并发情况下会导致环形链表,产生死循环。

虽然 JDK1.8 采用了尾插法解决了这个问题,但是并发下的 put 操作也会使前一个 key 被后一个 key 覆盖。

由于 HashMap 有扩容机制存在,也存在 A 线程进行扩容后,B 线程执行 get 方法出现失误的情况。

最后更新于