我下面的教程,它基本上解釋了有關競爭狀態的原因在多線程環境調整的Hashmap時發生的情況:哈希映射在多線程環境中時做調整
在Java中,如果兩個線程在同一時間發現,現在HashMap需要調整大小,並且它們都嘗試調整大小。在Java中對HashMap進行大小調整的過程中,存儲在鏈表中的存儲區中的元素在遷移到新存儲區時會按順序顛倒過來,因爲Java HashMap不會在尾部附加新元素,而是在頭部添加新元素避免尾部遍歷。如果隨後的比賽情況發生了,你會看完這個結束了一個無限循環
我有兩個問題:
- 爲什麼每個區塊的鏈接列表中的順序顛倒?
- 我可以看到可能存在競爭條件,但看不到無限循環如何來?是否因爲一個線程可能會將元素頭附加到尾部,而另一個線程則以相反的順序進行呢?
請幫我澄清一下,非常感謝!
我不知道回答你的問題 - 我只是想建議你使用線程安全的[ConcurrentHashMap的(多線程程序中的http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ConcurrentHashMap.html)。 –
'HashMap'不是線程安全的,在多線程環境中使用它是一個壞主意。您將在另一種方法中獲得競賽條件。 – gaborsch