你知道为什么HashMap是线程不安全的吗
JDK1.7中的HashMap
- 在HashMap的扩容函数transfer函数中,在对table进行扩容到newTable后,需要将原来数据转移到newTable中,使用的是头插法,也就是链表的顺序会翻转,可能会造成数据丢失,形成环形链表,造成死循环。
JDK1.8中HashMap
- 在jdk1.8中对HashMap进行了优化,在发生hash碰撞,不再采用头插法方式,而是尾插法,直接插入链表尾部,因此不会出现环形链表的情况,但是在多线程的情况下仍然不安全,会发生数据覆盖的情况。
参考: |