powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Синхронизация synchronizedList
71 сообщений из 71, показаны все 3 страниц
Синхронизация synchronizedList
    #37880625
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Кто имел дело с synchronizedList, посоветуйте пожалуйста. Проблема в следующем. Существует несколько потоков одни потоки добавляют в лист элементы, другие удаляют, а третьи просто перебирают их. Как их синхронизировать? Т.е как сделать так, чтобы когда один поток занимается своим делом, то другие ждут пока он его освободит. И можно ли для таких листов использовать foreach? Заранее огромное спасибо за помощь!
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880634
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно циклы синхронизировать по той же коллекции.
http://stackoverflow.com/a/1775738

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

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

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

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

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

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

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

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

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

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

Код: 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
Синхронизация synchronizedList
    #37880734
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно лишь от части. Потому что после того как сервер скомутировал двух клиентов, он может про них забыть. И те работают напрямую, пока соединение не отвалиться. Тогда они снова переподключаются через сервер.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880742
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И, снова, непонятно откуда требования в немедленном удалении. Клиенты никак не могут скомутироваться кроме как друг с другом.
Соответственно если в списке находится мертвая сессия, в этом ничего страшного нет. Остальные могут спокойно этот список перебирать в поисках своего клиента. Вообще не до конца понятно назначение списк. Ведь клиенты обычно комутируются по некому уникальному ID. Зачем тут переобр списка?
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880747
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Как забыть? А если кто-то еще хочет подключится к этому ПК, то ему нужно сообщить о том что он занят другим подключением. К тому же нужно где-то хранить все ссылки на них для того чтобы было из чего выбирать и что искать.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880757
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczИ, снова, непонятно откуда требования в немедленном удалении.
Зачем занимать память? Т.е вы предлагаете как-то помечать их при их отключении? К примеру устанавливать значение поля isDead=true?
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880760
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelКак забыть? А если кто-то еще хочет подключится к этому ПК, то ему нужно сообщить о том что он занят другим подключением. К тому же нужно где-то хранить все ссылки на них для того чтобы было из чего выбирать и что искать.
У вас клиенты случайным образом комутируются? Т.е. нет заранее обозначеной пары?
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880768
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelЗачем занимать память?

Чтобы оптимизировать производительсноть. Если нужно оптимизировать память, то, везде пишем synchronized.

GorloPavelТ.е вы предлагаете как-то помечать их при их отключении? К примеру устанавливать значение поля isDead=true?
Да. Помечать и удалять. А интераторы при обходе снэпшота могут дополнительно пропускать "мертвые" элементы. Опять же это лишь уменьшает вероятно использовния "мертвого" клиента. Ведь он может умереть сразу после того как будет использован, независимо от того какой механизм синхронизации вы примените.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880772
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще поверх всего этого работает таймер который проверяет не мертва ли сессия. Ведь бывает так что связь оборвалась а Socket думает что все в норме и событие отключение не происходит. По этому каждые несколько минут в событии этого самого таймера происходит пометка каждой сессии. Устанавливается поле isAlive=flase. Если же клиент жив(обменивается данными), то он в функции получения данных ставит этот isAlive=true... Если же при следующем срабатывании таймера это занчение так и осталось false значит эту самую сессию нужно удалить из списка и сделать соотвествующую запись в БД. Так же все еще живому его партнеру нужно сообщить что он мертв. Потом естественно при отсутсвии ссылки на объект его уберет GC и памяти.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880782
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczДа. Помечать и удалять.


Ну почему бы не удалить его сразу? Т.е вы предлагаете удалить его по таймеру. Который будет временами пробегать по списку и удалять помеченные? Но где гарантия что в процессе удаления не произойдет проблем? Какой-то поток в этот момент будет производить перебор...
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880786
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavel,

И могу ли я использовать foreach? Или лучше так...?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
synchronized (sessions) {
	Iterator<Session> i=sessions.iterator();
							
	while(i.hasNext())
	{
	     Session serverSession =i.next();
              //что-то делаем с serverSession... 
        }
}
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880792
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelЕще поверх всего этого работает таймер который проверяет не мертва ли сессия. Ведь бывает так что связь оборвалась а Socket думает что все в норме и событие отключение не происходит. По этому каждые несколько минут в событии этого самого таймера происходит пометка каждой сессии. Устанавливается поле isAlive=flase. Если же клиент жив(обменивается данными), то он в функции получения данных ставит этот isAlive=true... Если же при следующем срабатывании таймера это занчение так и осталось false значит эту самую сессию нужно удалить из списка и сделать соотвествующую запись в БД. Так же все еще живому его партнеру нужно сообщить что он мертв. Потом естественно при отсутсвии ссылки на объект его уберет GC и памяти.
У вас сервер перекачкой данных занимается что ли? Зачем это всё, если после комутации клиенты могут работать напрямую без сервера?
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880796
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz Зачем это всё, если после комутации клиенты могут работать напрямую без сервера?
Как? Соединение такого типа SERVER(серый ip)<---->HUB SERVER<---->КЛИЕНТ.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880811
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelНу почему бы не удалить его сразу?
Откуда удалить?
Из общей коллекции тогда :
- не понятно что делать с итераторами, когда структура коллекции поменялась
- не понятно что делать с итераторами, которые только что приняли этот элемент за живой
Если использовать CopyOnWrite, то вообще из snapshot-а никак не удалить.
Чего вы добьетесь своим "удалением сразу"

GorloPavelТ.е вы предлагаете удалить его по таймеру.
Какой ещё таймер? Я предлагаю удалить его в любой подходящий момент.

GorloPavelКоторый будет временами пробегать по списку и удалять помеченные?
CopyOnWrite удалит немедленно, кроме тех потоков, которые в данный момент итерируются. Зачем таймер?


GorloPavelНо где гарантия что в процессе удаления не произойдет проблем?
О каких проблемах речь? Я вам объясняю, что никакая синхронизация вам не гарантирует что не валидый конекшн не будет использован. Соединение может умереть сразу же как только вы выйдете из блока синхронизации и начнете его использовать. Поэтому бороться с невалидным соединением нужно на уровне его использования, а не итерации по списку.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880827
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczGorloPavelНу почему бы не удалить его сразу?
Откуда удалить?
Из общей коллекции тогда :
- не понятно что делать с итераторами, когда структура коллекции поменялась
- не понятно что делать с итераторами, которые только что приняли этот элемент за живой
Если использовать CopyOnWrite, то вообще из snapshot-а никак не удалить.
Чего вы добьетесь своим "удалением сразу"

GorloPavelТ.е вы предлагаете удалить его по таймеру.
Какой ещё таймер? Я предлагаю удалить его в любой подходящий момент.

GorloPavelКоторый будет временами пробегать по списку и удалять помеченные?
CopyOnWrite удалит немедленно, кроме тех потоков, которые в данный момент итерируются. Зачем таймер?


GorloPavelНо где гарантия что в процессе удаления не произойдет проблем?
О каких проблемах речь? Я вам объясняю, что никакая синхронизация вам не гарантирует что не валидый конекшн не будет использован. Соединение может умереть сразу же как только вы выйдете из блока синхронизации и начнете его использовать. Поэтому бороться с невалидным соединением нужно на уровне его использования, а не итерации по списку.

Неужели все не так как я думаю?


Список_1:
1
2
3
4

Поток #1:

Блокируем_список(Список_1)
Удаляем элемент номер 2

Разблокируем_список(Список_1)

Поток #2
Блокируем_список(Список_1)
Читаем список - элемент номер 1

Ну и наоборот... Я не прав?
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880830
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каждый поток ждет пока его освободит другой... Нельзя такое?
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880833
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczКакой ещё таймер? Я предлагаю удалить его в любой подходящий момент.


Какой такой момент? Тысячи пользователей работают... Подключаются и отключаются. Вы представляете что будет если на каждую сессию будет выделятся хотя бы 512кб ОЗУ?
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880836
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelКак? Соединение такого типа SERVER(серый ip)<---->HUB SERVER<---->КЛИЕНТ.
Я же вам приводил ссылки про NAT Punch-Through. Вы их так и не осилили? Странно что у вас тут сервер за серым IP. Обычно это клиент. Но не важно. Для вашей схемы:

SERVER коннектиться на HUB SERVER с определенного порта NAT
HUB SERVER сообщает КЛИЕНТУ порт и IP этого NAT
КЛИЕНТ конектиться на IP и порт NAT
NAT перекидывает соединение на конечный SERVER

В результате КЛИЕНТ знает адрес и порт NAT, а NAT знает что этот порт используется для комутации с SERVER. Так они и соединяются и работают на прямую. HUB нужен только для соединения.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880842
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelКаждый поток ждет пока его освободит другой... Нельзя такое?
Можно, но. Во-первых это сильно негативно сказывается на производительность. Все потоки ждут пока один переберет коллекцию.
Во-вторых возможно появление такого эффекта как starving. До одного потока никогда не доходит очередь, потому что остальные потоки постоянно используют критический ресурс.
Пока у вас нагрузка никакая, побочных эффектов нет. Как только сервер начнет подходить к предельной нагрузке, начнут появляться необъяснимые эффекты.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880845
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Получается что неразрешимая задача?
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880847
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz NAT Punch-Through. Вы их так и не осилили?
Когда вы приводили мне эти ссылки?
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880848
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelКакой такой момент? Тысячи пользователей работают... Подключаются и отключаются. Вы представляете что будет если на каждую сессию будет выделятся хотя бы 512кб ОЗУ?
snapshot массива это только массив ссылок, а не полная глубокая копия. 4 байта на элемент. Вряд ли у вас будет более 1к постоянных, клиентов. Это 4к на поток. Пусть даже 1000 потков, это всего 4Мб. Если вы выжмете из сервера нагрузку в 1К клиентов и 1К потоков, что, мне кажется, маловероятным, то CopyOnWrite отожрет максимум 4Мб, а в реальности намного меньше.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880850
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczGorloPavelКакой такой момент? Тысячи пользователей работают... Подключаются и отключаются. Вы представляете что будет если на каждую сессию будет выделятся хотя бы 512кб ОЗУ?
snapshot массива это только массив ссылок, а не полная глубокая копия. 4 байта на элемент. Вряд ли у вас будет более 1к постоянных, клиентов. Это 4к на поток. Пусть даже 1000 потков, это всего 4Мб. Если вы выжмете из сервера нагрузку в 1К клиентов и 1К потоков, что, мне кажется, маловероятным, то CopyOnWrite отожрет максимум 4Мб, а в реальности намного меньше.

В данный момент более 4к.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880851
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelBlazkowicz NAT Punch-Through. Вы их так и не осилили?
Когда вы приводили мне эти ссылки?
Прошу прощения. Думал это ваша тема была:
12817225
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880853
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelВ данный момент более 4к.
более 4к клиентов и более 4к потоков? Что там за железо такое в холостую молотит данные?
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880854
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок. Действительно. А что если их просто помечать как вы советовали. Ну и пусть они висят. А по таймеру блочить этот лист к примеру раз в 20 секунд чистить... ну а потом пусть все читают дальше... Ну а если будут проблемы с производительностью или памятью, то можно уменьшать или увеличивать таймер очистки. Как вы думаете?
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880858
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

2 ядра 2 гига. Занято всего ~800 метров ОЗУ.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880863
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

К сожалению NAT Punch-Through как я понял нормально работает только с UDP.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880866
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavel2 ядра 2 гига. Занято всего ~800 метров ОЗУ.
Ну, то есть, не более 4х одновременно активных потоков? При списке в 4К это 128Кб расходов на CopyOnWrite
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880868
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelК сожалению NAT Punch-Through как я понял нормально работает только с UDP.
http://en.wikipedia.org/wiki/TCP_hole_punching
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880881
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Ну как не более... Кол-во растет. Т.е вы хотите сказать что при >4000 сокет-потоков при том что каждый будет работать с этим листом CopyOnWrite будет занимать не более мегабайта ОЗУ? И еще... Я немного не понял про CopyOnWrite... Не получится так, что один поток уже удалил элемен, а другой имеет копию листа с неудаленным элементом и будет расценивать его как живой?
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880900
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelНу как не более... Кол-во растет. Т.е вы хотите сказать что при >4000 сокет-потоков при том что каждый будет работать с этим листом CopyOnWrite будет занимать не более мегабайта ОЗУ?
У вас мало ядер. Соответственно не так много потоков будут бороться за этот список. Даже если у вас в JVM 4К потоков, из них активных только 4, ну и побороться за ресурс смогут максимум 10-20. И то - врядли, переключение контекста не на столько часто, как мне кажется, будет происходить.

GorloPavelИ еще... Я немного не понял про CopyOnWrite... Не получится так, что один поток уже удалил элемен, а другой имеет копию листа с неудаленным элементом и будет расценивать его как живой?
Давайте не путать понятия. Живой- не живой это в вашей доменной модели. Да. Итератор, будет видеть элемент удаленный другим потоком. Но, как я уже несколько раз писал выше, это не критично.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880907
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz Но, как я уже несколько раз писал выше, это не критично.

Ну как же не критично? Ведь при переборе объектов один клиент может с коммутироваться с другим, которого уже нет!
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880909
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Вы сами использовали TCP hole punching? Т.е это позволит мне подключать две стороны peer-to-peer которые(оба) находятся за NAT.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880910
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelНу как же не критично? Ведь при переборе объектов один клиент может с коммутироваться с другим, которого уже нет!
Вы это должны предусмотреть в момент комутации. Потому что клиент может издохнуть уже после того как вы перебрали список, но до того как начали использовать, несмотря ни на какую синхронизацию.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880918
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelВы сами использовали TCP hole punching? Т.е это позволит мне подключать две стороны peer-to-peer которые(оба) находятся за NAT.
Skype и TeamViewer именно так и работают. Нет никакого центрального сервера, который прокачивает все данные.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880929
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПотому что клиент может издохнуть уже после того как вы перебрали список
Как? Ведь когда список заблокирован на удаление его не могут читать... И наоборот. Ну к примеру ситуация... Один поток издыхает, но не успел удалиться из списка и ждет когда ему отдадут список, а второй поток который читает видит что он еще в списке и передает ему ссылку на себя. И тут он заканчивает читать список и управление передается тому потоку который не успел помереть и тут он видит что ему уже передана ссылка на клиента...

synchronized (sessions) {
//---ТУТ ОН ПОНЯЛ ЧТО ОН СВЯЗАН
//ПОСЛАЛ КОМПАНЬОНУ ИНФУ О ТОМ ЧТО ЕГО УЖЕ НЕТ
//Удалил себя из списка sessions
}

Так нельзя?
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880938
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
synchronized (sessions) {  //1 ищем клиента
   for (Session serverSession : sessions) { //2 перебираем список
        //3 находим клиента
   }
} //4 особождаем блокировку

//7 имеем на руках мертвую сессию

synchronized (sessions) { //5 захватываем список
   sessions.remove(session); //6 убиваем мертвую сессию
}
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880942
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczSkype и TeamViewer именно так и работают. Нет никакого центрального сервера, который прокачивает все данные.
Ок. Спасибо за наводку. Теперь осталось найти реализацию всего этого на java и C#.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880946
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
synchronized (sessions) {  //1 ищем клиента
   for (Session serverSession : sessions) { //2 перебираем список
        //3 находим клиента
   }
} //4 особождаем блокировку

//7 имеем на руках мертвую сессию

synchronized (sessions) { //5 захватываем список
   sessions.remove(session); //6 убиваем мертвую сессию
}



Не понял.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880960
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так?
Код: 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.
synchronized (sessions) {  //1 ищем клиента
   for (Session serverSession : sessions) { //2 перебираем список
        this.partner=session;
        session.partner=this;
        break;
   }
} 

партнер помирает и ждет когда ему отдадут список...

synchronized (sessions) {
   this.partner.партнер_мертв();
   sessions.remove(this);
}


public void партнер_мертв()
{
   что-то понаделали...
   this.partner=null;
}


GC... объект убран из кучи.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880966
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelНе понял.
1..4, 7 - один поток
5, 6 - второй поток
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37880970
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

И? Посмотрите мою версию. Что не так?
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37881008
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelИ? Посмотрите мою версию. Что не так?
Я не понял идею.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37881027
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поток 1
synchronized (sessions) { //Блокируем
for (Session serverSession : sessions) { //Перебираем список и находим то, что нам нужно
this.partner=session;//Себе оставляем ссылку на объект
session.partner=this;//Ему передаем ссылку на себя
break;
}
}

Этим временем партнер помирает(его поток в котором он читает данные из сокета останавливается)
Ему нужно сделать пометку в БД(лог) что я был и удалить себя из списка. Но список еще заблочен.

Поток 1 освобождает список...

synchronized (sessions) { Захватываем список
//Вызываем функцию которая делает пометку в БД.
this.partner.партнер_мертв();
sessions.remove(this);
}


public void партнер_мертв()
{
что-то понаделали...
this.partner=null;
}


А так?
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37881035
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати.. Нет реализации TCP_hole_punching под .NET. А нужен :(
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37881065
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavel,

UPnP еще не все роутеры поддерживают.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37881559
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

А трафик все равно придется гонять через сервер. Попробовал UPnP... Сработало! Но при включенном брадмауэре или другом файрволе такое не прокатывает. Т.к они не позволяют в большинстве случаев послать широковещалку для обнаружения роутера и последующей настройки UPnP. Но как бы там ни было эта возможность значительно снизит нагрузку на сервер. Спасибо вам за наводку! Вы мне очень помогли ! Ну а с листами пока повоюю.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37881625
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelкак сделать так, чтобы когда один поток занимается своим делом, то другие ждут пока он его освободит. И можно ли для таких листов использовать foreach?
foreach использовать можно.
GorloPavelНо как я понимаю этот путь неверный...
Отчего же вы так понимаете? Для изначально сформулированной задачи это именно что классический верный путь.
Другое дело, что он может не подойти по производительности, так как полностию исключает параллельную работу со списком. Чтобы разрешить частично параллельную работу, можно отдельно синхронизировать читателей и писателей (несколько читателей работают одновременно) - для этого вместо synchronized использовать Reentrantlock.
Чтобы еще более распарелелить работу со списком, уже надо вникать в конкретные требования. В общем случае, нарисуйте сеть Петри чтобы увидеть все параллельные (и последовательные) места.
...
Рейтинг: 0 / 0
Синхронизация synchronizedList
    #37884713
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rfq,

А что если использовать обычный массив? его размер будет отвечать за максимально возможное кол-во. А вместо удаления ставить null?
...
Рейтинг: 0 / 0
71 сообщений из 71, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Синхронизация synchronizedList
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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