Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Синхронизация synchronizedList / 25 сообщений из 71, страница 1 из 3
16.07.2012, 14:27:55
    #37880625
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
Здравствуйте. Кто имел дело с synchronizedList, посоветуйте пожалуйста. Проблема в следующем. Существует несколько потоков одни потоки добавляют в лист элементы, другие удаляют, а третьи просто перебирают их. Как их синхронизировать? Т.е как сделать так, чтобы когда один поток занимается своим делом, то другие ждут пока он его освободит. И можно ли для таких листов использовать foreach? Заранее огромное спасибо за помощь!
...
Рейтинг: 0 / 0
16.07.2012, 14:33:45
    #37880634
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
Можно циклы синхронизировать по той же коллекции.
http://stackoverflow.com/a/1775738

Но лучше поискать более подходящую реализацию. Например посмотреть на CopyOnWriteArrayList.
...
Рейтинг: 0 / 0
16.07.2012, 14:34:37
    #37880636
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
synchronizedList в этом случае не поможет. Тут либо CopyOnWriteArrayList, либо в зависимости от своей логики писать какие-нибудь блокировки руками (Latch, Lock, Barrier и т.д.)
...
Рейтинг: 0 / 0
16.07.2012, 14:35:36
    #37880638
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
Кроме прочего можно и read\write операции к списку обезопасить без "синхронизации". Использовать ReadWriteLock и LinkedList, например.
...
Рейтинг: 0 / 0
16.07.2012, 14:38:56
    #37880640
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
BlazkowiczКроме прочего можно и read\write операции к списку обезопасить без "синхронизации". Использовать ReadWriteLock и LinkedList, например.

Можно пример? Спасибо.
...
Рейтинг: 0 / 0
16.07.2012, 14:40:40
    #37880645
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
Так... Если использовать CopyOnWriteArrayList, то можно не парится и он сам позаботится о синхронизации?
...
Рейтинг: 0 / 0
16.07.2012, 14:42:26
    #37880650
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
GorloPavelТак... Если использовать CopyOnWriteArrayList, то можно не парится и он сам позаботится о синхронизации?
Само по себе ничего не будет. Всё зависит от того как ваша система часто делает изменения и итерации. Вомзожно потери производительности на создание снэпшотов окажутся значительными.
...
Рейтинг: 0 / 0
16.07.2012, 14:46:04
    #37880655
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
Blazkowicz,

Очень часто перебор и удаление. И не должно быть ситуации когда один поток удалил элемент, а другой в этот момент перебирал и наткнулся на него.
...
Рейтинг: 0 / 0
16.07.2012, 14:47:36
    #37880658
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
GorloPavelМожно пример? Спасибо.
Чего пример? Разберитесь что такое связанный список. Например поток добавляющий данные с головы, никак не мешает потоку удаляющему элемент с хвоста. Аналогично можно на массиве построить цикличный буфер. Даже быстрее будет. Мы же не знаем какая у вас супер задача и для чего этот список вообще.
...
Рейтинг: 0 / 0
16.07.2012, 14:47:59
    #37880659
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
GorloPavelBlazkowicz,

Очень часто перебор и удаление. И не должно быть ситуации когда один поток удалил элемент, а другой в этот момент перебирал и наткнулся на него.
Если у вас такие требования, то он вам не поможет.
...
Рейтинг: 0 / 0
16.07.2012, 14:49:54
    #37880661
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
schwa,

Что посоветуете?
...
Рейтинг: 0 / 0
16.07.2012, 14:50:32
    #37880663
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
GorloPavelИ не должно быть ситуации когда один поток удалил элемент, а другой в этот момент перебирал и наткнулся на него.
Это очень странное требование. Логически подумайте над ним. А что если поток который перебирал, обработает элемент на миллисекунду раньше чем другой поток его удалит? А если позже? А на что эта миллисекунда влияет в вашей системе?
...
Рейтинг: 0 / 0
16.07.2012, 14:55:25
    #37880676
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
Blazkowicz,

Ок... Сетевое приложение. TCP сервер. При подключении клиента создается экземпляр объекта(сессии) ссылка на который добавляется в synchronizedList, так же в этот объект(сессию) передается ссылка на этот самый лист. При отключении сессия должна вызвать synchronized функцию в которой произведет запись в БД, а потом удалить себя из списка. При этом еще живые сессии могут перебирать коллекцию этих самых сессий и взаимодействовать с ними. Как быть?
...
Рейтинг: 0 / 0
16.07.2012, 14:55:30
    #37880677
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
GorloPavelschwa,

Что посоветуете?
Как ни странно, но CopyOnWriteArrayList :))
Только гарантию отсутствия повторной обработки сделать через какой-нибудь флаг в обрабатываемом объекте.
...
Рейтинг: 0 / 0
16.07.2012, 14:58:03
    #37880682
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
schwa,

Очень критичны расходы на память. Как я понял при чтении списка будет создаваться копия объекта листа и производится перебор. Так?
...
Рейтинг: 0 / 0
16.07.2012, 15:02:04
    #37880687
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
BlazkowiczА что если поток который перебирал, обработает элемент на миллисекунду раньше чем другой поток его удалит? А если позже? А на что эта миллисекунда влияет в вашей системе?
Так.. Так вот я и спрашиваю. Как сделать так чтобы к примеру один из потоков читает список, то все остальные ждут. Независимо от того что они собираются делать. И наоборот.
...
Рейтинг: 0 / 0
16.07.2012, 15:03:09
    #37880691
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
GorloPavelСетевое приложение. TCP сервер. При подключении клиента создается экземпляр объекта(сессии) ссылка на который добавляется в synchronizedList, так же в этот объект(сессию) передается ссылка на этот самый лист. При отключении сессия должна вызвать synchronized функцию в которой произведет запись в БД, а потом удалить себя из списка. При этом еще живые сессии могут перебирать коллекцию этих самых сессий и взаимодействовать с ними. Как быть?
Вот видите. Становиться ясно что требование, которые вы описали выше, особого смысла не имеет. Ничего страшного, если юзер, который был залогинен несколько секунд назад, получит какие-то данные. Опять же можно пришить его соединение и он ничего не получит.
...
Рейтинг: 0 / 0
16.07.2012, 15:03:43
    #37880692
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
GorloPavelОчень критичны расходы на память. Как я понял при чтении списка будет создаваться копия объекта листа и производится перебор. Так?
Т.е. производительность, можно сказать, не важна?
...
Рейтинг: 0 / 0
16.07.2012, 15:05:26
    #37880697
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
GorloPavelТак.. Так вот я и спрашиваю. Как сделать так чтобы к примеру один из потоков читает список, то все остальные ждут. Независимо от того что они собираются делать. И наоборот.
12872670
Только учтите что в таком случае у вас сервер будет поддерживать 40-50 одновременных сессий без видимых тормозов. А то и меньше.
...
Рейтинг: 0 / 0
16.07.2012, 15:05:39
    #37880699
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
И еще... В момент отключения и удаления элемента, если элемент связан с другим элементом, то он сообщает ему об этом. К примеру если потоки взаимодействуют друг с другом(существует друг на друга ссылка) и в один прекрасный момент один из них решил отключится и удалится из списка, то он сообщает об этом своему потоку-партнеру. Так что ничего страшного. Это работает уже довольно стабильно год. Но иногда возникают проблемы. Как я понял они связанны с синхронизацией. Хочется поправить этот момент.
...
Рейтинг: 0 / 0
16.07.2012, 15:10:11
    #37880704
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
GorloPavel,

Если Критична память, то java, давай, до свидания.
Просто напишите тест и посмотрите сколько времени занимает занимает модификация листа с реальными данными. Это крайне преждевременная оптимизация.
...
Рейтинг: 0 / 0
16.07.2012, 15:17:33
    #37880715
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
Blazkowicz,

Попробую объяснить поподробнее. Приложение это это сервер который позволяет обходить NAT. Т.е соединять два TCP клиента. Представьте есть приложение сервер которое ставиться на ПК и приложение клиент которое ставится на смартфон. Приложение которое на ПК должно как-то себя определить и идентифицироваться клиентом. Так вот. Это приложение производит регистрацию на сервере путем создания пары логин-пароль который естественно сохраняется в БД. После оно авторизируется на этом сервере и на сервере создается объект(сессия-сокет) в котором есть поле которое определяет его тип Server(ПК) или Client(смартфон) и естественно добавляется в synchronizedList. Возникает момент когда клиент(самртфон) хочет подключиться к Server(ПК) он подключается к серверу(тот самый к которому подключаются все) на нем создается опять же объект(сессия-сокет) в поле которого определяется что он клиент. Далее он производит поиск по synchronizedList и ищет есть ли в списке тот самый подключенный ПК, если есть, то они обмениваются ссылками друг на друга и производят взаимодействие(обмен данными). Но вдруг возникает ситуация и один из них отключается... Тут-то и происходит удаление... А в этот момент кто-то ищет себе пару для взаимодействия. Надеюсь понятно объяснил. По такому типу работает такая замечательная программа как TeamViewer и подобные включая мое приложение.
...
Рейтинг: 0 / 0
16.07.2012, 15:21:33
    #37880729
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
Сейчас используется конструкция типа

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
synchronized (sessions) {

   for (Session serverSession : sessions) {
        //---------------------------------------
   }

{

synchronized (sessions) {
   sessions.remove(session);
}



Но как я понимаю этот путь неверный...
...
Рейтинг: 0 / 0
16.07.2012, 15:22:48
    #37880734
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
Понятно лишь от части. Потому что после того как сервер скомутировал двух клиентов, он может про них забыть. И те работают напрямую, пока соединение не отвалиться. Тогда они снова переподключаются через сервер.
...
Рейтинг: 0 / 0
16.07.2012, 15:26:02
    #37880742
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация synchronizedList
И, снова, непонятно откуда требования в немедленном удалении. Клиенты никак не могут скомутироваться кроме как друг с другом.
Соответственно если в списке находится мертвая сессия, в этом ничего страшного нет. Остальные могут спокойно этот список перебирать в поисках своего клиента. Вообще не до конца понятно назначение списк. Ведь клиенты обычно комутируются по некому уникальному ID. Зачем тут переобр списка?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Синхронизация synchronizedList / 25 сообщений из 71, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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