Java 解释导致HashMap.put()执行无限循环的时间

Java 解释导致HashMap.put()执行无限循环的时间,java,concurrency,thread-safety,hashmap,Java,Concurrency,Thread Safety,Hashmap,正如许多人注意到并遇到的那样,HashMap.put在并发使用时会进入无限执行循环(请参阅,可能就是这样) HashMap被清楚地记录为非线程安全。显然,正确的修复方法是使用Map的线程安全实现,尤其是ConncurrentHashMap。我更好奇的是导致无限循环的并发计时。我最近在一个Java7JRE中遇到了这个循环,我想了解确切的原因。例如,这是由多个看跌期权同时导致的吗 查看内部显示HashMap.Entry包含指向下一个节点(在bucket中?)的链接。我假设这些链接正在损坏,包含循环引

正如许多人注意到并遇到的那样,
HashMap.put
在并发使用时会进入无限执行循环(请参阅,可能就是这样)

HashMap
被清楚地记录为非线程安全。显然,正确的修复方法是使用
Map
的线程安全实现,尤其是
ConncurrentHashMap
。我更好奇的是导致无限循环的并发计时。我最近在一个Java7JRE中遇到了这个循环,我想了解确切的原因。例如,这是由多个看跌期权同时导致的吗


查看内部显示
HashMap.Entry
包含指向下一个节点(在bucket中?)的链接。我假设这些链接正在损坏,包含循环引用,这导致了无限循环。然而,我仍然不清楚这种腐败是如何发生的。

与许多人的想法相反,
多线程
哈希映射
的主要问题不仅仅是重复条目或消失条目。。。正如您所说,当两个或多个
线程同时决定调整
HashMap
的大小时,可能会发生无限循环

如果HashMap的大小超过了给定的阈值,那么几个线程可能会同时尝试调整它的大小,如果我们足够幸运(您已经在生产环境中部署了代码),它们将永远保持不变

该问题是由
void resize(int newCapacity)的方式引起的和<代码>无效转移(条目[]新表格)已实现,您可以自己查看。坏运气、好时机、颠倒的条目(在此数据结构中不需要排序)以及在线程继续运行时(e!=null)
错误地相互引用的组合

虽然我可以自己给你一个解释,但我想赞扬的是,在我第一次决定弄清楚为什么几个月前我没有被录用的时候,我就知道这是怎么回事了(无论如何,我不能比他做得更好)

正如保罗所说,描述这场比赛最好的词是“条件”:“美丽”