面试题答案
一键面试问题
- 数据丢失:当多个线程同时对HashMap进行put操作时,可能会导致部分数据丢失。
- 死循环:在HashMap扩容时,多线程并发操作可能会形成环形链表,进而导致死循环,使程序CPU占用率飙升。
- 获取到null值:在多线程环境下,当一个线程正在对HashMap进行结构修改(如put、remove),另一个线程进行get操作时,可能会获取到null值,即使该键对应的值实际上不为null。
原因
- 数据丢失:HashMap不是线程安全的,在多线程环境下,不同线程的put操作可能会相互覆盖。例如,线程A和线程B同时计算要插入的位置,然后线程A先插入了数据,线程B随后插入,由于它们计算的位置相同,线程B的数据就覆盖了线程A的数据。
- 死循环:在JDK1.7及之前版本的HashMap扩容机制中,需要重新计算元素在新数组中的位置并移动元素。多线程并发扩容时,可能会导致元素的移动顺序混乱,从而形成环形链表。在后续的get操作遍历链表时,就会陷入死循环。
- 获取到null值:在多线程操作HashMap时,由于没有同步机制,当一个线程对HashMap的结构进行修改时(如resize操作改变了数组结构),另一个线程可能正在读取数据,此时可能会读到未完全更新的数据,导致获取到null值。