
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
01.02.2012, 16:28:54
|
|||
|---|---|---|---|
|
|||
Синхронизация |
|||
|
#18+
Всем привет. Есть такой участок кода: Код: java 1. 2. 3. 4. И есть такой код в другом потоке (сокет, таймер): Код: java 1. Участков кода первого типа много, второго - несколько. Соответственно, иногда возникает ошибка IllegalModificationException. Знаю, что нужно использовать synchronized, но к какому участку кода его применить первому или второму. И как его использовать: блочно или ко всему методу, где выполняются эти участки кода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.02.2012, 16:36:52
|
|||
|---|---|---|---|
|
|||
Синхронизация |
|||
|
#18+
То есть, ошибка ConcurentModificationException. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.02.2012, 16:37:08
|
|||
|---|---|---|---|
Синхронизация |
|||
|
#18+
Обернут должен быть и сам цикл (весь) и операция user.remove(user). Что именно использовать для блокировки - тупо synchronized или же что-то более высокоуровневое и java.util.concurrent - сразу и не скажешь, зависит от ваших требований. Так как есть читатели/писатели, то очень напрашивается использование ReadWriteLock вместо syncronized. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.02.2012, 16:39:18
|
|||
|---|---|---|---|
|
|||
Синхронизация |
|||
|
#18+
mre Код: java 1. Откройте для себя свойства. В отличие от полей, они обладают полиморфизмом. (Вообще использования статики тоже не является хорошый практикой, как и цепной вызов, который, скорее всего, является признаком нарушения инкапсуляции) mreИ есть такой код в другом потоке (сокет, таймер): Код: java 1. Участков кода первого типа много, второго - несколько. В этом случае проще использовать синхронизированую коллекцию, чем синхронизировать все методы. mreЗнаю, что нужно использовать synchronized Можно, не значит нужно. Тут вообще сложная ситуация. У вас итерации по этой коллекции работают в разных потоках, или все в одном? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.02.2012, 16:48:41
|
|||
|---|---|---|---|
|
|||
Синхронизация |
|||
|
#18+
Так как в любом случае синхронизация коллекции никак не спасёт все итераторы, то нужно инкапсулировать метод values() и делать с него слепок в синхронизированом методе. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Сам remove нужно реализовать в модели. Иначе прямой доступ нарушает инкапсуляцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.02.2012, 17:08:19
|
|||
|---|---|---|---|
|
|||
Синхронизация |
|||
|
#18+
У меня сокет-сервер для большого числа пользователей. Когда, например, пользователь уходит из игры, я делаю remove (в таймере раз в минуту проверяю подключен ли сокет), ну а чтение в рабочем порядке по необходимости: какое-то действие пользователя, или таймер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.02.2012, 17:16:12
|
|||
|---|---|---|---|
|
|||
Синхронизация |
|||
|
#18+
mreУ меня сокет-сервер для большого числа пользователей. У меня для вас плохие новости. Пока вы не освоите материал на уровне понимания Java Concurrency in Practice, у вас будет сокет-сервер для небольшого числа пользователей. Вообще сокет-сервер это Netty и MINA. А работа с юзерами это уже бизнес-логика приложения. mreКогда, например, пользователь уходит из игры, я делаю remove (в таймере раз в минуту проверяю подключен ли сокет), ну а чтение в рабочем порядке по необходимости: какое-то действие пользователя, или таймер. Возможности готового сокет-сервера не позволяют отследить отключения пользователя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.02.2012, 17:18:01
|
|||
|---|---|---|---|
|
|||
Синхронизация |
|||
|
#18+
mreУ меня сокет-сервер для большого числа пользователей. В этом случае лучше всеми возможными способами избегать всего что связано со словом synchronized. Начать с ReadWriteLock и не блокирующих алгоритмов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.02.2012, 17:22:12
|
|||
|---|---|---|---|
|
|||
Синхронизация |
|||
|
#18+
Ок, спасибо, а не подскажите как можно следующий код применить к моему случаю? Код: java 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.02.2012, 17:35:23
|
|||
|---|---|---|---|
|
|||
Синхронизация |
|||
|
#18+
mreОк, спасибо, а не подскажите как можно следующий код применить к моему случаю? Гугл подскажет: https://www.google.com/search?q=ReadWriteLock+example Вам нужен именно ReadWriteLock. При использовании обычного ReentrantLock, методы чтения будут блокировть вызовы из разных потоков. Хотя читать в разных потоках безопасно и без блокировки. Как я уже писал выше все методы доступа должны быть в модели. Все эти методы делятся на два типа - читающие и модифицирующие. Чтение не блокирует чтение, но блокирует модификацию. Модификация блокирует и чтение и модификации в других потоках. Метод для итерации - getUsers() в любом случае нужно делать слепком. Пример уже привел. Это метод чтения. В нем используется readLock(). Метод remove и аналогичные нужно завернуть в блокировку через writeLock(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.02.2012, 17:42:48
|
|||
|---|---|---|---|
Синхронизация |
|||
|
#18+
Пока вы не прочитаете Java Concurrency in practice, или хотя бы Java Memory model, любые ваши попытки написать корректный многопоточный код врядли приведут к чему то хорошему. Теоретически вы сможете написать, но гарантировать его правильность - нет. Что касается вашего случая, возможно подойдет просто замена коллекции на CopyOnWriteArrayList или ConcurrentHashMap. Если не подойдет, то synchronized или reentrantLock, и поймите, когда вы спрашиваете - что у меня тут не правильно и как мне сделать - мы не видем весь ваш код, а так как основные траблы в многопоточном программировании вылазят 'иногда' и "часто в месте в котором не ждали", то другого выхода кроме как разобраться в предмете у вас нет. Если нужно кое что уточнить - пожалуйста, а теорию будьте добры изучите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.02.2012, 17:50:17
|
|||
|---|---|---|---|
|
|||
Синхронизация |
|||
|
#18+
Ясно, спасибо вам всем! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=59&tablet=1&tid=2132672]: |
0ms |
get settings: |
15ms |
get forum list: |
25ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
359ms |
get topic data: |
23ms |
get forum data: |
5ms |
get page messages: |
90ms |
get tp. blocked users: |
2ms |
| others: | 351ms |
| total: | 884ms |

| 0 / 0 |
