Все, я пытался понять проблему с условием многопоточности для функции изменения размера Hashmap.Почему Hashmap не работает быстро в функции изменения размера? (для проблемы с проблемой многопотоковой расы)
Как я читал из here. Проблема состояния гонки вызовет бесконечную связь цикла для списка записей.
Я уже знал, что Hashmap
имеет механизм с быстрой задержкой, чтобы немедленно остановить доступ к нему несколькими потоками. Следующий код показывает это.
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
Вопрос: почему сбойный режим не работает для функции изменения размера? код отлаживать ниже. (Jdk1.7)
void transfer(Entry[] newTable, boolean rehash) {
int newCapacity = newTable.length;
for (Entry<K,V> e : table) {
while(null != e) {
Entry<K,V> next = e.next;
if (rehash) {
e.hash = null == e.key ? 0 : hash(e.key);
}
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
}
}
}
Поскольку for
не использует Iterator
?
Обновлено
Или Поскольку размер функция не использует Put*
, Remove*
, Clear*
метод, который будет вызывать значение modCount
изменилось? Пожалуйста, помогите, пожалуйста, подтвердить это. (Простите меня плохой английский.)
Спасибо.
Это сообщение из ссылки, опубликованной OP «Когда два или более потока видят необходимость изменения размера одного и того же хэш-файла, они ** могут ** в конечном итоге добавить элементы старого ведра в новое ведро одновременно и, следовательно, могут привести к бесконечные петли. FYI, в случае столкновения, т. е. когда есть разные ключи с одним и тем же хэш-кодом, внутри мы используем один связанный список для хранения элементов ». По сути, это утверждение может быть расширено от вашего ответа. Я прав? –