多くの人が指摘し、HashMap.put
同時に使用すると無限実行ループに陥る可能性があることに遭遇しました(GRIZZLY-1207、JGRP-525、おそらくHHH-6414、および this SO answerを参照)。
HashMap
スレッドセーフではないことが明確に文書化されています。明らかに、正しい修正は、特に のスレッドセーフな実装を使用することMap
ですConncurrentHashMap
。無限ループを引き起こす同時タイミングについてもっと興味があります。最近、Java 7 JRE でこのループに遭遇しました。正確な原因を理解したいと思います。たとえば、これは同時に複数のプットが原因ですか?
HashMap.putの中を見るHashMap.Entry
と、次のノード (バケット内?) へのリンクが含まれていることがわかります。これらのリンクが破損して循環参照が含まれているため、無限ループが発生していると思います。ただし、その破損がどのように発生しているのかはまだ正確にはわかりません。