我正在关注一个教程,它基本上解释了在多线程环境中调整 Hashmap 大小时发生的竞争条件的原因:
在 Java 中,如果两个线程同时发现现在 HashMap 需要调整大小并且它们都尝试调整大小。在Java中调整HashMap大小的过程中,存储在链表中的bucket中的元素在迁移到新bucket期间会按顺序颠倒,因为java HashMap不会将新元素附加到尾部,而是将新元素附加到头部避免尾部遍历。如果发生竞态条件,那么您将最终陷入无限循环
阅读本文后,我有两个问题:
- 为什么每个桶的链表顺序颠倒?
- 我可以看到可能存在竞争条件,但看不到无限循环是如何产生的?是不是因为一个线程可能会从头到尾追加元素,而另一个线程则以相反的顺序执行?
请帮我澄清一下,非常感谢!