powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Что будет если использовать HashMap в многопоточной среде?
3 сообщений из 28, страница 2 из 2
Что будет если использовать HashMap в многопоточной среде?
    #39388624
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerВсе знают, что в многопоточной среде нужно использовать синхронизованные коллекции.

Меня тут спросили, а что будет если использовать обычную хеш мапу? ConcurrentModificationException
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388779
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerвот что за первая итерация у них нарисована?



и чем thread1 buckets отличается от thread2 buckets?

Тут и тут примерно все разобрано.
Пока идет чтение переменных по reference или вызов функций возвращаюших значение в одном потоке, другой поток может изменить значения по reference внутри массива или на сам массив (добавить элемент в массив или скопировать массив), в результате у каждого потока может указатель на различные массивы или переменные в массиве (один поток добавил ключ а другой этот элемент не увидел и продублировал операцию либо увеличил массив при переполнении длины) - учтите такой фактор как синхронизация и видимость данных между потоками - когда HashMap не volatile, возникают дополнительные комбинации для race condition так как сложно сказать когда изменения сделанные в одном потоке будет видны в другом.

Даже при работе в многопоточном режиме только на чтение из hashmap желательно учитывать когда создаются потоки и когда заканчивает заполняеться hashmap.

The answer is yes, there are potential race conditions:

when resizing an HashMap by two threads at the same time
when collisions happens. Collision can happen when two elements map to the same cell even if they have a different hashcode. During the conflict resolution, there can be a race condition and one added key/value pair could be overwritten by another pair inserted by another thread.

To explain better what I mean on the second point, I was looking at the source code of HashMap in OpenJdk 7

Код: java
1.
2.
389        int hash = hash(key.hashCode());
390        int i = indexFor(hash, table.length);



First it calculates an Hash of your key (combining two hash functions), then it maps to a cell with indexFor, then it checks if that cell contains the same key or is already occupied by another one. If it's the same key, it just overwrite the value and there is no problem here.

If it's occupied it looks at the next cell and then the next until it finds an empty position and call addEntry(), which could even decide to resize the array if the array is more loaded than a certain loadFactor.

Our table containing the entries is just a vector of Entry which holds key and value.

Код: java
1.
2.
3.
4.
146    /**
147     * The table, resized as necessary. Length MUST Always be a power of two.
148     */
149    transient Entry[] table;



In a concurrent environment, all sort of evil things can happen, for instance one thread gets a collision for cell number 5 and looks for the next cell (6) and finds it empty.

Meanwhile another thread gets an index of 6 as a result of indexFor and both decide to use that cell at the same time, one of the two overwriting the other.
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388795
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UsmanquestionerВсе знают, что в многопоточной среде нужно использовать синхронизованные коллекции.

Меня тут спросили, а что будет если использовать обычную хеш мапу? ConcurrentModificationException

Один из возможных вариантов, но только при итерации
...
Рейтинг: 0 / 0
3 сообщений из 28, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Что будет если использовать HashMap в многопоточной среде?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]