|
|
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Такое дело. Код: java 1. В этом HashMap-e находятся некие сессии где ключ это ID пользователя. Когда пользователь отключается сессия удаляется. Код: java 1. Все отлично работает. Но как быть если в системе разрешено быть авторизированным двум сессиям с одним и тем же ID пользователя? Ну то есть грубо говоря на двух ПК в сидят под одной и той же учеткой, но при этом сессии разные. Пробовал сделать так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. Естественно все эти методы могут вызываться из разных потоков, и я получаю ошибки связанные с List<Session>. И это естественно, потому что пока я foreach-у список сессия может быть удалена методом removeUser из другого потока. Как быть? Как сделать так что-бы при работе со списком List<Session> все потоки ждали пока занимающий его поток не закончит с ним работу? Пока сделал так :) Код: java 1. Так как ConcurrentHashMap потокобезопасен. Но мне кажется это кривое решение. Заранее огромное спасибо за помощь! P.S: JRE 1. 6 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 05:20 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
Как я понял CopyOnWriteList мне не подходит. Ведь при каждом изменении производится копирование массива и потом подменяется ссылка. Но что будет если в момент удаления произойдет добавление? Или я что-то не понимаю. Просто попробовал использовать CopyOnWriteList и сразу сильно возрасло потребление памяти и оно постоянно растет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 07:59 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
GorloPavel, не понятно зачем HashMap - id usera дублируется, он же в сессии есть, может HashSet хватит? у меня так Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. вот это должно помочь Collections.unmodifiableCollection(USER_SESSIONS) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 09:21 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
am_sasaвот это должно помочь Collections.unmodifiableCollection(USER_SESSIONS) Это никак не может помочь пользователю, так как ему необходимо эту коллекцию изменять, а unmodifiableCollection запрещает удаление. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 09:28 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
GorloPavel , CopyOnWriteArrayList - нормальное решение, когда у вас много чтений, но мало записей. Память у вас течет из-за бага где-то у вас, а не из-за на него. Если CopyOnWriteArrayList не устраивает, то используйте другую коллекцию из java.util.concurrent, коих очень много - Set, Queue, Deque - в зависимости от того, что вам больше подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 09:32 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
cdtyjv, в каком месте удаление? Код: java 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 09:42 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
am_sasa , Ну вы проблему автора читали? :-) Ему нужно конкурентно обновлять коллекцию. А вы ему на это отвечаете: "Вам должен помочь Collections.unmodifiableList". Вопрос: как он ему поможет? Collections.unmodifiable* полезены только в двух случаях: 1) Это публичный API, которым будет пользоваться хрен знает кто. 2) Это не публичный API, но разработчик все равно хочет перестраховаться, использую unmodifiableList в качестве своеобразного assert. К проблема конкуретного доступа к коллекциям Collections.unmodifiable* отношения вообще не имеет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 10:00 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
Если нужно разрашить множественные сессии под одним аккаунтом, то нужно максимально везде заменить userId на sessionId: Map<SessionId, Session> А для каждой операции с userId, нужно хорошенько подумать, почему там нужен именно userId, а не sessionId. И свести такие операции к минимуму. Ведь юзер работает в двух РАЗНЫХ сессиях и он не ожидает что в обоих сессиях будет идентичное состояние, только потому что внутри всё равно всё привязано к userId. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 11:25 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
Может мне кто-нибудь объяснить? Как я понимаю в этом случае remove и add потокобезопасны? Т.е если какой-то поток добавляет что-то в лист, то поток который хочет удалить будет ожидать завершения удаления и наоборот? А чтобы синхронизировать и перебор(все ждут пока идет перебор) нужно делать так? Код: java 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 13:58 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЕсли нужно разрашить множественные сессии под одним аккаунтом, то нужно максимально везде заменить userId на sessionId: Map<SessionId, Session> А для каждой операции с userId, нужно хорошенько подумать, почему там нужен именно userId, а не sessionId. И свести такие операции к минимуму. Ведь юзер работает в двух РАЗНЫХ сессиях и он не ожидает что в обоих сессиях будет идентичное состояние, только потому что внутри всё равно всё привязано к userId. К моему приложению это не подходит. Мне нужно именно синхронно редактировать или читать список. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 14:00 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
cdtyjv GorloPavel , CopyOnWriteArrayList - нормальное решение, когда у вас много чтений, но мало записей. Память у вас течет из-за бага где-то у вас, а не из-за на него. Да нет бага. Просто заменяю на Код: java 1. и памяти на 15-20% меньше жрет приложение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 14:51 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
CopyOnWriteArrayList очень агресивно использует память, что, как бы, следует из его названия и принципа работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 14:53 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
GorloPavelBlazkowiczЕсли нужно разрашить множественные сессии под одним аккаунтом, то нужно максимально везде заменить userId на sessionId: Map<SessionId, Session> А для каждой операции с userId, нужно хорошенько подумать, почему там нужен именно userId, а не sessionId. И свести такие операции к минимуму. Ведь юзер работает в двух РАЗНЫХ сессиях и он не ожидает что в обоих сессиях будет идентичное состояние, только потому что внутри всё равно всё привязано к userId. К моему приложению это не подходит. Мне нужно именно синхронно редактировать или читать список. не очень понял ответ Blazkowicz'у. Разве 2 пользователя под одним именем но на разных компах не A синхронно работают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 15:25 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
Petro123GorloPavelпропущено... К моему приложению это не подходит. Мне нужно именно синхронно редактировать или читать список. не очень понял ответ Blazkowicz'у. Разве 2 пользователя под одним именем но на разных компах не A синхронно работают? Асинхронно. Но сервер с списком сессий должен работать синхронно. Долго объяснять. Вообщем мне не подходит это решение. Я уже думал над этим. Пожалуйста прокомментируйте это сообщение 15252928 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 15:38 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
GorloPavel, не очень понял, зачем бегать по списку в конкурентном окружении? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 15:53 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
GorloPavel, и приведи конкретный код с ошибкой минимальный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 15:54 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
Petro123GorloPavel, и приведи конкретный код с ошибкой минимальный Ну как же. А если во время foreach другой поток удалит из списка элемент? Пользователь отключается, а в этот момент сервер пробегает по списку и рассылает пользователям под этой учеткой "ПРИВЕТ ТОВАРИЩ!" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 15:59 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
GorloPavelPetro123GorloPavel, и приведи конкретный код с ошибкой минимальный Ну как же. А если во время foreach другой поток удалит из списка элемент? Пользователь отключается, а в этот момент сервер пробегает по списку и рассылает пользователям под этой учеткой "ПРИВЕТ ТОВАРИЩ!" :) Так не критично же? Ну а что вас спасет если вы успели пробежать по циклу, но клиент отосединился как раз когда вы посылаете сообщение? Выдуманно как-то смотрится проблема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 16:08 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
забыл ник, +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 16:13 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
забыл никGorloPavelпропущено... Ну как же. А если во время foreach другой поток удалит из списка элемент? Пользователь отключается, а в этот момент сервер пробегает по списку и рассылает пользователям под этой учеткой "ПРИВЕТ ТОВАРИЩ!" :) Так не критично же? Ну а что вас спасет если вы успели пробежать по циклу, но клиент отосединился как раз когда вы посылаете сообщение? Выдуманно как-то смотрится проблема. А null pointer exception? Ну и вообще изменилась же коллекция, а я тут форичу. Вообщем с CopyOnWriteArrayList работает, но жрет память. С Код: java 1. вообще все отлично и памяти навалом и работает хорошо. Вот как-нибудь сделать такой же список. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 16:37 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
Последний вариант мне кажется кривым, но он замечательно работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 16:38 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
Попробовал так Код: java 1. - вообще все повисло в какой-то момент, видимо где-то дедлочит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 16:39 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
GorloPavelПопробовал так Код: java 1. - вообще все повисло в какой-то момент, видимо где-то дедлочит. Использование synchronized в многопоточных приложениях это не только потенциальные взаимоблокировки но и удар по производительности системы в целом. Особено учитывая тот факт что это у вас центральное состояние всех пользователей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 16:43 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
GorloPavelдедлочит OFF осталось взять Оракл - неблокировочник)))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 16:46 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
GorloPavelа я тут форичу зачем? Сделай список по уникальному ключику ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 16:47 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
ммммм. центральный список польз. должен быть синхронным. Т.е. при закрытии сессии нужно убрать из списка. Обычное дело для списка респондентов в операционке или ГУИ-контролах при перерисовке. Добавив проверки на висяки получим решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 17:02 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
Petro123ммммм. центральный список польз. должен быть синхронным. Т.е. при закрытии сессии нужно убрать из списка. Обычное дело для списка респондентов в операционке или ГУИ-контролах при перерисовке. Добавив проверки на висяки получим решение. Не понял вас. У меня значением Hash таблицы является список. Он должен быть синхронизирован. С этим списком могут работать N потоков. Один из потоков может читать, другой писать, третий удалять. И все это может происходить "одновременно". Пользователь отключился - сессия удалилась из списка. Список стал "нулевым", т.е сессий с данным аккаунтом уже нет - удалился сам список из хэш таблицы. Вопрос как синхронизировать список внутри хэш таблицы? Пока остановился на CopyOnWriteArrayList. Но хочется чего-то подобного ConcurrentHashMap но только для списка, ведь с ним тоже в программе работает много потоков, и читают и удаляют, добавляют. И никаких с ним проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 17:17 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
GorloPavelМожет мне кто-нибудь объяснить? Как я понимаю в этом случае remove и add потокобезопасны? Т.е если какой-то поток добавляет что-то в лист, то поток который хочет удалить будет ожидать завершения удаления и наоборот? А чтобы синхронизировать и перебор(все ждут пока идет перебор) нужно делать так? Код: java 1. 2. 3. 4. 5. 6. 7. Нет. Потоко безопасность не распространяется на составные операции, как то "взять элемент из итератора, а потом его удалить". С точки зрения итерирования synchronizedCollection никак вам не поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 17:36 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
GorloPavel, не нужно делать Один ко многим из списков. Если убрать слово поток и заменить его на UserID+SessionID как ключик списка. То, параллельно работают 3 юзверя в списке из 3-х элементов. В чём проблема и где тут Null ошибка? ЗЫ SessionID - ключик в списке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 17:39 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
cdtyjvС точки зрения итерирования synchronizedCollection никак вам не поможет. В CopyOnWriteArrayList мое спасение? :) Правда памяти жрет не мало :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 17:42 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
GorloPavel, Коллега, ну вам же дали уже ответ, что вы продолжаете упорствовать со своими сомнениями? ПО вашим требованиям, вам нужна конкуретнтая мапка, в которой будет сидеть конкурентная коллекция. Ну так и делайте это, ничего кривого в этом нет: ConcurrentHashMap<Integer, CopyOnWriteArrayList<Session>> ConcurrentHashMap<Integer, ConcurrentArrayQueue<Session>> ConcurrentHashMap<Integer, ConcurrentLinkedQueue<Session>> ConcurrentHashMap<Integer, ConcurrentLinkedDeque<Session>> Громоздко не значит "криво". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2013, 17:43 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
List<Session> userSessions = Server.USER_SESSIONS.get(session.mUserId); synchronized (userSessions) { ///Все операции с userSessions } разве это не ответ на вопрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2014, 20:03 |
|
||
|
ConcurrentHashMap и List
|
|||
|---|---|---|---|
|
#18+
Я думаю, топикстартеру надо вооооот это: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ConcurrentHashMultiset.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2014, 23:08 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2126626]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 465ms |

| 0 / 0 |
