Ответ 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