powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Синхронизация synchronizedList
25 сообщений из 71, страница 2 из 3
Синхронизация 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
25 сообщений из 71, страница 2 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Синхронизация synchronizedList
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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