正如许多人指出并遇到的那样,在HashMap.put
同时使用时可能会进入无限执行循环(请参阅GRIZZLY-1207、JGRP-525、可能是HHH-6414和这个 SO答案)。
HashMap
被明确记录为不是线程安全的。显然,正确的解决方法是使用线程安全的实现Map
,ConncurrentHashMap
尤其是。我对导致无限循环的并发时序更好奇。我最近在使用 Java 7 JRE 时遇到了这个循环,并想了解确切的原因。例如,这是由多个 put 同时引起的吗?
查看HashMap.put内部显示HashMap.Entry
包含到下一个节点的链接(在存储桶中?)。我假设这些链接正在损坏以包含循环引用,这导致了无限循环。但是,我仍然不明白这种腐败是如何发生的。