HashMap 是线程安全的吗,为什么不是线程安全的。
- 不是线程安全的,因为多线程环境下,使用 HashMap 进行 put 操作可能会引起死循环,导致 CPU 利用率接近 100%,所以在并发情况下 HashMap 不是线程安全的。
- 如果有两个线程 A 和 B,都进行同时插入数据,刚好这两条不同的数据经过哈希码是一样的,且该位置还没有其他的数据。所以这两个线程都会进入。假设一种情况,线程 A 通过 if 判断,该位置还没有哈希冲突,进入 if 语句,还没有进行数据插入,这时候 CPU 就把资源让给了线程 B,线程 A 停在了 if 语句里面,线程 B 判断该位置没有哈希冲突(线程 A 的数据还没插入),也进入了 if 语句,线程 B 执行完后,轮到线程 A 执行,现在线程 A 判断直接在该位置插入而不用在判断(因为已经判断过了,准备执行插入操作)。这时候,会发现线程 A 把线程 B 插入的数据给覆盖了。发生了线程不安全情况。本来在 HashMap 中,发生哈希冲突是可以链表法或者红黑树来解决的,但是在多线程中,可以就直接给覆盖了