|
|
|
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 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38491993&tid=2126626]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
176ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 475ms |

| 0 / 0 |
