
Mishka
12.02.2017
07:35:51
В большое количество потоков передается ссылка на объект HashMap. Эти потоки только добавляют в HashMap значения. Вопрос, надо ли делать HashMap синхронизированным?

Artem
12.02.2017
07:41:26
Нужно, лучше использовать ConcurrectHashMap

sss3 ?
12.02.2017
07:41:26
Чем канкарент хеш мап не угодил?

Mishka
12.02.2017
07:46:21
Просто я не со всем глубоко понимаю зачем мне канкарент? Я же только вставляю запись в мапу. Зачем мне блокировать? У меня разве могут записаться значения в один и тот же бакет?

Google

Denis
12.02.2017
07:47:12
могут

sss3 ?
12.02.2017
07:47:12
Канкарент не блочит

Mishka
12.02.2017
07:48:50
а почему они могут записать в один и тот же бакет? hash код же уникален?

Vlad
12.02.2017
07:50:10
Хэш код не уникален. Колизии же возможны.

Mishka
12.02.2017
07:53:44
Ну да это понятно, но как у меня может встретится одинаковый хэшкод если ключ и значения даже все уникальные
По этому всё равно не понятно, зачем мне канкарент в hashmap при только вставке. При редактировании понятно дело что нужен

sss3 ?
12.02.2017
07:56:21
Хеш ограничен интом => не уникален

Dan
12.02.2017
07:57:15
/stat@combot

Combot
12.02.2017
07:57:18
combot.org/chat/-1001043090457

Mishka
12.02.2017
07:57:46
это получается что при вставке к hashmap в одном даже потоке, может записаться в один и тот же бакет?

Denis
12.02.2017
07:58:50

Mishka
12.02.2017
07:59:41
а где посмотреть или как называется?
уже нашёл

Google

Mishka
12.02.2017
08:01:39
любо совпал хэшкод (произошла коллизия), тогда элементом этого массива устанавливается новая запись, у которой есть поле, ссылающееся на старую запись. Таким образом, в следующий раз для просмотра записей в этом элементе необходимо будет пройти связанный список записей <ключ, значение>.
но всё равно зачем тогда канкарент?)) для Array листа тоже понятно зачем нужен канкарент для вставки. Ну а для Hash зачем нужен если идёт вставка не по номеру, а по хэшкоду

Denis
12.02.2017
08:04:48
У тебя в 2х потоках происходит коллизия, первый поток создает связанный элемент. Второй создает его же и перезатирает значение которое внес первый

Mishka
12.02.2017
08:06:26
а теперь понятно) спасибо)

Ilshat
12.02.2017
08:09:12
Ну и хешмэп может делать resize. Когда другой поток захочет добавить запись

Mishka
12.02.2017
08:21:37
Не будет коллизии из двух потоков
как генерится hashcode в java 1.8, недавно на хабре была статься про это
что используется алгоритм. Состояние потока + xorshift
А состояние потока это
входят такие параметры, как стек, набор значений регистров процессора, адрес исполняемой команды и прочее
Так 2 разных потока не могут сделать одинаковый хэшкод
по этому канкарент в hash map мне точно не нужен

Azat
12.02.2017
08:26:46
может все таки в этой статье говорилось про identity hashcode?
hashcode по умолчанию

Mishka
12.02.2017
08:27:35
https://habrahabr.ru/company/mailru/blog/321306/

Azat
12.02.2017
08:29:11
в заголовке об этом и написано

Mishka
12.02.2017
08:29:38
и для hashmap это не относится?
точнее генерация hashcode в нём

Azat
12.02.2017
08:30:49
посмотри код добавления элемента в hashmap
hashcode это один из методов класса object

Google

Azat
12.02.2017
08:35:49
в мапе вычисляется хэш на основе хэшкода переданного объекта

Mishka
12.02.2017
08:38:53
чёт читаю не могу понять в чём разница от по умолчанию и от object

Ruslan
12.02.2017
08:39:23
То чувство, когда в learnjava темы хардкорнее

Dmitry
12.02.2017
08:40:36
угу, с утра там константпул человек писать пытался

Ruslan
12.02.2017
08:40:40
Тот что по умолчанию как бы определен в object классе, от которого наследует ся все и вся
чёт читаю не могу понять в чём разница от по умолчанию и от object
Если никто не перебил этот метод в иерархии, значит будет хэшкод по умолчанию
Но если его никто не переопределил, значит тебе, как пользователю, он скорее всего не понадобится

Mishka
12.02.2017
08:46:12
-Если никто не перебил
-Но если его никто не переопределил
???

Azat
12.02.2017
08:48:21
Зачем тебе вообще мапа у которой в качестве ключей объекты у которых identity hash code?

Mishka
12.02.2017
08:50:31
Я всё равно не понял в чем отличия от по умолчанию и от object. У меня в мапе ключ это String. Все уникальные ключи. HashCode так и сяк будет разный всегда и не должно быть коллизии при вставке с нескольких потоках

Azat
12.02.2017
08:55:51
Посмотри для начала какой контакт должен быть у equals и hashcode, посмотри как добавляются элементы в hashmap, что происходит когда у элементов одинаковый hashcode

Nikolai
12.02.2017
08:57:21

Mishka
12.02.2017
09:00:30

Adam
12.02.2017
09:08:01
запись не запись, ты когда из нее читать потом будешь можно значения пропустить изза того что синхронизации нет

Mishka
12.02.2017
09:09:12
Чтение уже идёт когда все потоки отработали

Adam
12.02.2017
09:09:32
и что
у тебя нет гарантии что эти потоки свои изменения скинули в общую память
тот поток который читает может сидеть со своей закешированной мапой и ничего не знать про то что в нее записывали

Mishka
12.02.2017
09:10:45
понял

Google

Mishka
12.02.2017
09:12:13
но с 10к записями коллизии ещё не возикало. По этому этот вариант и не думал

Alexander
12.02.2017
09:18:08


Friedrich
12.02.2017
10:08:12
По этому всё равно не понятно, зачем мне канкарент в hashmap при только вставке. При редактировании понятно дело что нужен
Реализация хэшмапа может использовать внутри массивы (или тот же ArrayList) для хранения объектов с совпавшими хэшами, или ещё как-нибудь хитро поступать. В итоге у тебя любая модификация мапы может привести к расширению этих ArrayList ов. Ну а почему добавление элемента в ArrayList нужно делать с блокировками — ты, судя по твоим словам, уже понимаешь.
Пока ты полностью не проверифицировал *весь* код используемой тобой реализации HashMap, ты *ничего* не можешь сказать про то, имеешь ли ты право опустить там блокировки. Моя ставка, что не имеешь.
В конце концов, документация в явном виде говорит, что при "структурных модификациях" ты обязан блокировать работу с HashMap (и приводит определение структурных модификаций — это удаления и добавления). Всё остальное, о чём не говорит документация — слухи и догадки, и может поменяться даже в минорных апдейтах.
Документация тут: https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html
см. со слов "Note that this implementation is not synchronized"


Anton
12.02.2017
10:12:55
тут вот классный ответ по этой теме есть http://stackoverflow.com/a/2688817/431270

Sergey
12.02.2017
12:22:50
провайдер дал sdk для интеграции с его системой. этот sdk немного подтекает. даже если на каждый запрос создаешь с нуля клиента из-за того что он внутри сам себе создает потоки, делает гадость со статикой, он все равно кушает память
что делать в такой ситуации?
на SO говорят делать форк процесса с jvm и там делать "грязную работу", через N итераций сносить этот процесс и поднимать новый

Admin
ERROR: S client not available

Dmitry
12.02.2017
13:12:28
дело говорят :)

Andy
12.02.2017
13:12:29
System.exit(1) :) Как-товидел такое в одном проекте. Перезапускали так веб сервер чтобы память не утекала )

Sergey
12.02.2017
13:18:49

Andy
12.02.2017
13:19:26
вот ) а я это видел в джава проекте )

Aleksey
12.02.2017
14:03:38

Alex
12.02.2017
14:04:29
В том, что это плохо?
Хотябы тем же SLA

Aleksey
12.02.2017
14:06:13

Sergey
12.02.2017
14:09:40
Когда старт приложения 5 секунд и всего 1 инстанс запущен, то не очень вариант с рестартом

Anton
12.02.2017
14:12:22
какой то прям watchdog pattern

Sergey
12.02.2017
14:15:01
Есть еще какие-то варианты?

Юра В
12.02.2017
14:15:43
пул jvm-машин, как в nailgun?

Anton
12.02.2017
14:19:23
ну как бы watchdog и есть вполне себе распространённая практика
которая и реализоваывается с N инстансами процесса

Google

Anton
12.02.2017
14:21:19
только System.exit не надо в код класть :)

Ruslan
12.02.2017
15:04:13
Интересно, помещается ли в головах людей Java и Scala? И не сводит ли это их с ума?)

Friedrich
12.02.2017
15:04:47
Скалошники этим наведённым безумием наслаждаются.

Ivan
12.02.2017
15:06:37
как будто Java такая сложная что надо прям много места под нее в башке

Alex
12.02.2017
15:12:06
/stat@combot

Combot
12.02.2017
15:12:06
combot.org/chat/-1001043090457

Anton
12.02.2017
15:13:27

Ruslan
12.02.2017
15:15:13

Luger
12.02.2017
15:17:05

Anton
12.02.2017
15:17:25

Ivan
12.02.2017
15:17:40
главное не пытаться в башку все совать что не попадя и что можно прочитать в доках, например API либ

Anton
12.02.2017
15:17:53

Юра В
12.02.2017
15:17:58
если когда-то занимался неуправляемым языком, то в голове такая пещера образуется, что туда много что поместится

Luger
12.02.2017
15:17:58

Aleksey
12.02.2017
15:17:59
А зчем либы еще в голове держать? Я каждый раз вот гуглю на пример как slf4j-sшmple конфигурить.

Ruslan
12.02.2017
15:18:23

Ivan
12.02.2017
15:18:29
почему бы и нет? :)
да есть чисто мусорная информация, например нафиг помнить какое там api у 10 http либ