为何 HashMap 不是线程安全的
HashMap 是一个可变对象
HashMap 对象的内部具有多个成员变量,对象具备多种状态,并且内部并没有设置同步策略来控制状态的变化
因为没有任何同步措施,HashMap 甚至不能保证内存可见性
在 JDK1.7 中,HashMap 采用头插法插入元素,因此并发情况下会导致环形链表,产生死循环。
虽然 JDK1.8 采用了尾插法解决了这个问题,但是并发下的 put 操作也会使前一个 key 被后一个 key 覆盖。
由于 HashMap 有扩容机制存在,也存在 A 线程进行扩容后,B 线程执行 get 方法出现失误的情况。
最后更新于