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

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

Я так понимаю, что если будет например один поток вставлять в мапу значение, которое приведет к удвоению всей мапы(лоад фактор превышен), а другой читать в момент удвоения, то произойти что-то плохое, а вот что конкретно - не очень понимаю.

Можете прояснить вопрос?
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39387956
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,
поиск делали?
http://begoml.by/hashmap-and-multithreading/
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39387990
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerВсе знают, что в многопоточной среде нужно использовать синхронизованные коллекции.

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

Непредсказуемое поведение.
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39387992
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никquestionerВсе знают, что в многопоточной среде нужно использовать синхронизованные коллекции.

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

Непредсказуемое поведение.

Что-то подобное я конечно сказал, но от меня хотели конкретики
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39387997
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Null pointer exception
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39387998
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123questioner,
поиск делали?
http://begoml.by/hashmap-and-multithreading/

Код: java
1.
2.
3.
4.
5.
6.
7.
do {
     Entry next = e.next;
     int i = indexFor(e.hash, newCapacity);
     e.next = newTable[i];
     newTable[i] = e;
     e = next;
 } while (e != null);



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public Object get(Object key) {
     Object k = maskNull(key);
     int hash = hash(k);
     int i = indexFor(hash, table.length);
     Entry e = table[i];
     while (true) {
         if (e == null)
             return e;
         if (e.hash == hash && eq(k, e.key))
             return e.value;
         e = e.next;
     }
 }



Не понял как параллельное исполнение этих участков кода приведет к циклической ссылке
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388000
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
но это видимо общеизвестный факт

http://stackoverflow.com/a/11050613/2674303 The get() goes to an infinite loop because one of the threads has only a partially updated view of the HashMap in memory and there must be some sort of pointer loop. That's the peril of using an unsynchronized collection with multiple threads.

но конкретика мне не понятна(
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388007
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Многопотоковое выполнение get втряд ли что-то может порушить. Т.ч. режим read only (только get) полностью безопасен.

А вот если какой-то поток меняет данные - то тут уж кранты. Я, все же, думаю, что ошибка будет null pointer exception ))) хотя и an infinite loop тоже достаточно приятно.
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388085
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerзабыл никпропущено...

Непредсказуемое поведение.

Что-то подобное я конечно сказал, но от меня хотели конкретики

"Непредсказуемое поведение" это очень даже конкретика.
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388104
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin"Непредсказуемое поведение" это очень даже конкретика.
Я бы обозвал скорее "недетерминированным". Предсказать-то можно попробовать. Но то как именно оно будет работать однозначно сказать нельзя, потому что в зависимости от реализации эффекты от использования в многопоточной среде могут быть любыми.

Очень странный и глупый вопрос как для собеседования.
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388257
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Пытаться понять почему get() может уйти в бесконечный цикл считаете нецелесообразным?
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388273
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerПытаться понять почему get() может уйти в бесконечный цикл считаете нецелесообразным?
Вы снова интерпретируете мои слова каким-то странным образом. Нецелесообразно спрашивать на интервью и нецелесообразно разбираться для самообучения - разные вещи.
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388274
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczquestionerПытаться понять почему get() может уйти в бесконечный цикл считаете нецелесообразным?
Вы снова интерпретируете мои слова каким-то странным образом. Нецелесообразно спрашивать на интервью и нецелесообразно разбираться для самообучения - разные вещи.

Да, я не пытался интрепретировать. Просто отдельный вопрос.
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388278
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerДа, я не пытался интрепретировать. Просто отдельный вопрос.
А давайте посмотрим на Java 8? Там может оказаться что никакого бесконечного цикла в HashMap уже и нет, например. Именно по этой причине правильный ответ на такой вопрос "недетерменированное поведение".
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388280
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczquestionerДа, я не пытался интрепретировать. Просто отдельный вопрос.
А давайте посмотрим на Java 8? Там может оказаться что никакого бесконечного цикла в HashMap уже и нет, например. Именно по этой причине правильный ответ на такой вопрос "недетерменированное поведение".

Чтобы понять может или не может, на мой взгляд, надо понять по какой причине это случается в java 6 (ну или для какой это пример).
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388281
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

или это в доке где-то написано?
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388282
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin"Непредсказуемое поведение" это очень даже конкретика.
)))) +1
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388291
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
questionerPetro123questioner,
поиск делали?
http://begoml.by/hashmap-and-multithreading/

Код: java
1.
2.
3.
4.
5.
6.
7.
do {
     Entry next = e.next;
     int i = indexFor(e.hash, newCapacity);
     e.next = newTable[i];
     newTable[i] = e;
     e = next;
 } while (e != null);



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public Object get(Object key) {
     Object k = maskNull(key);
     int hash = hash(k);
     int i = indexFor(hash, table.length);
     Entry e = table[i];
     while (true) {
         if (e == null)
             return e;
         if (e.hash == hash && eq(k, e.key))
             return e.value;
         e = e.next;
     }
 }



Не понял как параллельное исполнение этих участков кода приведет к циклической ссылке

Кажется тут объяснение http://mailinator.blogspot.ru/2009/06/beautiful-race-condition.html

попробую понять
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388344
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner, Вот ключевое в статье
авторThis is not a bug. HashMap is built specifically for its purpose and this implementation is not intended as threadsafe. There's a gaggle of ways to make it threadsafe, but in plain, vanilla, (and very fast) form - its not. And needless to say, you shouldn't be using it that way.


Если бы вам предоставили код и спросили - какие тут могут возникнуть ошибки при многопоточном использовании - это нормальный вопрос.

А если вас спросили
авторМеня тут спросили, а что будет если использовать обычную хеш мапу?
То единственный правильный ответ - недетерменированное поведение, потому что мапа не предназначена для этого. Хотя зная как вы умеете переиначить вопрос, я не уверен что это собеседующие не правы:)
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388348
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никquestioner, Вот ключевое в статье
авторThis is not a bug.

Который таки исправили.
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388388
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никquestioner, Вот ключевое в статье
авторThis is not a bug. HashMap is built specifically for its purpose and this implementation is not intended as threadsafe. There's a gaggle of ways to make it threadsafe, but in plain, vanilla, (and very fast) form - its not. And needless to say, you shouldn't be using it that way.


Если бы вам предоставили код и спросили - какие тут могут возникнуть ошибки при многопоточном использовании - это нормальный вопрос.

А если вас спросили
авторМеня тут спросили, а что будет если использовать обычную хеш мапу?
То единственный правильный ответ - недетерменированное поведение, потому что мапа не предназначена для этого. Хотя зная как вы умеете переиначить вопрос, я не уверен что это собеседующие не правы:)

я не ищу поддержки и понимаю, что человек, который это спрашивал явно больше меня знает и имеет больше опыта.

Я всего лишь хочу докапаться до истины.

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

Первым делом вам надо научиться правильно формулировать вопрос\проблему. Потому что мусор на входе - мусор на выходе. Ваше стремление совершенствоваться похвально, но если искать в неправильном месте - то это Сизифов труд

questionerда, был код. одного потока
и что вам конкретный код одного потока даст?

Вот опять, код не бывает "одного потока", код это просто код. Который можно запустить в многопоточной среде и эмулировать у себя в голове)

Вас интересует тема data race? Отлично, есть много примеров в сети, даже приведенный вами - изучайте, прокачивайтесь, если что непонятно - спрашивайте, но слушайте собеседников и не выдавайте свои додумывания за истину.
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388529
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот смотрите.

когда thread 2 закончился мы видим вот такую картинку:



thread1 начнёт исполняться со строки десять.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
1:  // Transfer method in java.util.HashMap -
2:  // called to resize the hashmap
3:  
4:  for (int j = 0; j < src.length; j++) {
5:    Entry e = src[j];
6:    if (e != null) {
7:      src[j] = null;
8:      do {
9:      Entry next = e.next; 
     // Thread1 STOPS RIGHT HERE
10:     int i = indexFor(e.hash, newCapacity);
11:     e.next = newTable[i];
12:     newTable[i] = e;
13:     e = next;
14:   } while (e != null);
15:   }
16: } 



Дальше я что-то теряю нить рассуждений. что за итерации он показывает.
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388536
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тут детали, если кто упустил http://mailinator.blogspot.ru/2009/06/beautiful-race-condition.html
...
Рейтинг: 0 / 0
Что будет если использовать HashMap в многопоточной среде?
    #39388555
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот что за первая итерация у них нарисована?



и чем thread1 buckets отличается от thread2 buckets?
...
Рейтинг: 0 / 0
Что будет если использовать 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
28 сообщений из 28, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Что будет если использовать HashMap в многопоточной среде?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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