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

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

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

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

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

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

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

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

Что-то подобное я конечно сказал, но от меня хотели конкретики
...
Рейтинг: 0 / 0
19.01.2017, 23:18
    #39387997
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что будет если использовать HashMap в многопоточной среде?
Null pointer exception
...
Рейтинг: 0 / 0
19.01.2017, 23:22
    #39387998
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что будет если использовать HashMap в многопоточной среде?
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
19.01.2017, 23:25
    #39388000
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что будет если использовать HashMap в многопоточной среде?
но это видимо общеизвестный факт

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
19.01.2017, 23:37
    #39388007
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что будет если использовать HashMap в многопоточной среде?
Многопотоковое выполнение get втряд ли что-то может порушить. Т.ч. режим read only (только get) полностью безопасен.

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

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

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

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

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

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

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

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

или это в доке где-то написано?
...
Рейтинг: 0 / 0
20.01.2017, 11:56
    #39388282
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что будет если использовать HashMap в многопоточной среде?
Alexey Tomin"Непредсказуемое поведение" это очень даже конкретика.
)))) +1
...
Рейтинг: 0 / 0
20.01.2017, 12:04
    #39388291
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что будет если использовать HashMap в многопоточной среде?
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
20.01.2017, 12:54
    #39388344
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что будет если использовать HashMap в многопоточной среде?
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
20.01.2017, 12:57
    #39388348
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что будет если использовать HashMap в многопоточной среде?
забыл никquestioner, Вот ключевое в статье
авторThis is not a bug.

Который таки исправили.
...
Рейтинг: 0 / 0
20.01.2017, 13:20
    #39388388
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что будет если использовать HashMap в многопоточной среде?
забыл ник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
20.01.2017, 13:40
    #39388417
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что будет если использовать HashMap в многопоточной среде?
questionerЯ всего лишь хочу докапаться до истины.

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

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

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

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

когда 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
20.01.2017, 15:34
    #39388536
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что будет если использовать HashMap в многопоточной среде?
тут детали, если кто упустил http://mailinator.blogspot.ru/2009/06/beautiful-race-condition.html
...
Рейтинг: 0 / 0
20.01.2017, 16:02
    #39388555
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что будет если использовать HashMap в многопоточной среде?
вот что за первая итерация у них нарисована?



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


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