Подтвердить что ты не робот

Объясните время, заставляющее HashMap.put() выполнять бесконечный цикл

По мере того, как ряд людей отметил и столкнулся с HashMap.put, он может перейти в бесконечный цикл выполнения при одновременном использовании (см. GRIZZLY-1207, JGRP-525, возможно HHH-6414, и этот SO ответ).

HashMap четко задокументирован как небезопасный поток. Очевидно, что правильное исправление заключается в использовании поточно-безопасной реализации Map, ConncurrentHashMap в частности. Мне больше любопытно о параллельном времени, которое вызывает бесконечный цикл. Недавно я столкнулся с этим циклом с Java JRE JRE и хотел бы понять точные причины. Например, это вызвано несколькими puts в одно и то же время?

Загляните внутрь HashMap.put показывает, что HashMap.Entry содержит ссылку на следующий node (в ведре?). Я предполагаю, что эти ссылки становятся развратными, чтобы содержать циклические ссылки, которые вызывают бесконечный цикл. Тем не менее, я до сих пор не понимаю, как именно происходит коррупция.

4b9b3361

Ответ 1

В противоположность тому, что многие люди думают, основная проблема с multi-threading и HashMaps - это не просто дублирующаяся запись или исчезающая. Как вы сказали, может возникнуть бесконечный цикл, когда два или несколько Threads одновременно решают изменить размер HashMap.

Если размер HashMap передает заданный порог, несколько потоков могут в конечном итоге попытаться изменить его размер в одно и то же время, и если нам повезет (вы уже развернули код в процессе производства), они будут продолжать навсегда..

Проблема вызвана тем, как реализованы void resize(int newCapacity); и void transfer(Entry[] newTable);, вы можете сами взглянуть на исходный код openjdk. Сочетание неудачи, хорошего времени, записей, которые меняются (заказы не требуются в этой структуре данных), и это приводит к ошибочному обращению друг к другу, пока поток продолжается while(e != null)...

В то время как я мог попытаться дать вам объяснение сам, я хочу отдать должное сообщению Paul Tyma (я все равно не могу сделать лучше, чем он), где я узнал, как это сработало в первый раз, когда я решил выяснить, почему я не был нанят на работу несколько месяцев назад...

http://mailinator.blogspot.com/2009/06/beautiful-race-condition.html

Как говорит Павел, лучшим словом для описания этой расы является условие: beautiful