|
|
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Как забыть? А если кто-то еще хочет подключится к этому ПК, то ему нужно сообщить о том что он занят другим подключением. К тому же нужно где-то хранить все ссылки на них для того чтобы было из чего выбирать и что искать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:27:30 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
BlazkowiczИ, снова, непонятно откуда требования в немедленном удалении. Зачем занимать память? Т.е вы предлагаете как-то помечать их при их отключении? К примеру устанавливать значение поля isDead=true? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:30:00 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelКак забыть? А если кто-то еще хочет подключится к этому ПК, то ему нужно сообщить о том что он занят другим подключением. К тому же нужно где-то хранить все ссылки на них для того чтобы было из чего выбирать и что искать. У вас клиенты случайным образом комутируются? Т.е. нет заранее обозначеной пары? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:31:38 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelЗачем занимать память? Чтобы оптимизировать производительсноть. Если нужно оптимизировать память, то, везде пишем synchronized. GorloPavelТ.е вы предлагаете как-то помечать их при их отключении? К примеру устанавливать значение поля isDead=true? Да. Помечать и удалять. А интераторы при обходе снэпшота могут дополнительно пропускать "мертвые" элементы. Опять же это лишь уменьшает вероятно использовния "мертвого" клиента. Ведь он может умереть сразу после того как будет использован, независимо от того какой механизм синхронизации вы примените. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:34:08 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Еще поверх всего этого работает таймер который проверяет не мертва ли сессия. Ведь бывает так что связь оборвалась а Socket думает что все в норме и событие отключение не происходит. По этому каждые несколько минут в событии этого самого таймера происходит пометка каждой сессии. Устанавливается поле isAlive=flase. Если же клиент жив(обменивается данными), то он в функции получения данных ставит этот isAlive=true... Если же при следующем срабатывании таймера это занчение так и осталось false значит эту самую сессию нужно удалить из списка и сделать соотвествующую запись в БД. Так же все еще живому его партнеру нужно сообщить что он мертв. Потом естественно при отсутсвии ссылки на объект его уберет GC и памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:34:58 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
BlazkowiczДа. Помечать и удалять. Ну почему бы не удалить его сразу? Т.е вы предлагаете удалить его по таймеру. Который будет временами пробегать по списку и удалять помеченные? Но где гарантия что в процессе удаления не произойдет проблем? Какой-то поток в этот момент будет производить перебор... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:37:40 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavel, И могу ли я использовать foreach? Или лучше так...? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:39:29 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelЕще поверх всего этого работает таймер который проверяет не мертва ли сессия. Ведь бывает так что связь оборвалась а Socket думает что все в норме и событие отключение не происходит. По этому каждые несколько минут в событии этого самого таймера происходит пометка каждой сессии. Устанавливается поле isAlive=flase. Если же клиент жив(обменивается данными), то он в функции получения данных ставит этот isAlive=true... Если же при следующем срабатывании таймера это занчение так и осталось false значит эту самую сессию нужно удалить из списка и сделать соотвествующую запись в БД. Так же все еще живому его партнеру нужно сообщить что он мертв. Потом естественно при отсутсвии ссылки на объект его уберет GC и памяти. У вас сервер перекачкой данных занимается что ли? Зачем это всё, если после комутации клиенты могут работать напрямую без сервера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:41:42 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Зачем это всё, если после комутации клиенты могут работать напрямую без сервера? Как? Соединение такого типа SERVER(серый ip)<---->HUB SERVER<---->КЛИЕНТ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:43:19 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelНу почему бы не удалить его сразу? Откуда удалить? Из общей коллекции тогда : - не понятно что делать с итераторами, когда структура коллекции поменялась - не понятно что делать с итераторами, которые только что приняли этот элемент за живой Если использовать CopyOnWrite, то вообще из snapshot-а никак не удалить. Чего вы добьетесь своим "удалением сразу" GorloPavelТ.е вы предлагаете удалить его по таймеру. Какой ещё таймер? Я предлагаю удалить его в любой подходящий момент. GorloPavelКоторый будет временами пробегать по списку и удалять помеченные? CopyOnWrite удалит немедленно, кроме тех потоков, которые в данный момент итерируются. Зачем таймер? GorloPavelНо где гарантия что в процессе удаления не произойдет проблем? О каких проблемах речь? Я вам объясняю, что никакая синхронизация вам не гарантирует что не валидый конекшн не будет использован. Соединение может умереть сразу же как только вы выйдете из блока синхронизации и начнете его использовать. Поэтому бороться с невалидным соединением нужно на уровне его использования, а не итерации по списку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:49:03 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
BlazkowiczGorloPavelНу почему бы не удалить его сразу? Откуда удалить? Из общей коллекции тогда : - не понятно что делать с итераторами, когда структура коллекции поменялась - не понятно что делать с итераторами, которые только что приняли этот элемент за живой Если использовать CopyOnWrite, то вообще из snapshot-а никак не удалить. Чего вы добьетесь своим "удалением сразу" GorloPavelТ.е вы предлагаете удалить его по таймеру. Какой ещё таймер? Я предлагаю удалить его в любой подходящий момент. GorloPavelКоторый будет временами пробегать по списку и удалять помеченные? CopyOnWrite удалит немедленно, кроме тех потоков, которые в данный момент итерируются. Зачем таймер? GorloPavelНо где гарантия что в процессе удаления не произойдет проблем? О каких проблемах речь? Я вам объясняю, что никакая синхронизация вам не гарантирует что не валидый конекшн не будет использован. Соединение может умереть сразу же как только вы выйдете из блока синхронизации и начнете его использовать. Поэтому бороться с невалидным соединением нужно на уровне его использования, а не итерации по списку. Неужели все не так как я думаю? Список_1: 1 2 3 4 Поток #1: Блокируем_список(Список_1) Удаляем элемент номер 2 Разблокируем_список(Список_1) Поток #2 Блокируем_список(Список_1) Читаем список - элемент номер 1 Ну и наоборот... Я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:54:32 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Каждый поток ждет пока его освободит другой... Нельзя такое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:55:36 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
BlazkowiczКакой ещё таймер? Я предлагаю удалить его в любой подходящий момент. Какой такой момент? Тысячи пользователей работают... Подключаются и отключаются. Вы представляете что будет если на каждую сессию будет выделятся хотя бы 512кб ОЗУ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:57:11 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
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 нужен только для соединения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:57:39 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelКаждый поток ждет пока его освободит другой... Нельзя такое? Можно, но. Во-первых это сильно негативно сказывается на производительность. Все потоки ждут пока один переберет коллекцию. Во-вторых возможно появление такого эффекта как starving. До одного потока никогда не доходит очередь, потому что остальные потоки постоянно используют критический ресурс. Пока у вас нагрузка никакая, побочных эффектов нет. Как только сервер начнет подходить к предельной нагрузке, начнут появляться необъяснимые эффекты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:00:21 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Получается что неразрешимая задача? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:03:42 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Blazkowicz NAT Punch-Through. Вы их так и не осилили? Когда вы приводили мне эти ссылки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:04:44 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelКакой такой момент? Тысячи пользователей работают... Подключаются и отключаются. Вы представляете что будет если на каждую сессию будет выделятся хотя бы 512кб ОЗУ? snapshot массива это только массив ссылок, а не полная глубокая копия. 4 байта на элемент. Вряд ли у вас будет более 1к постоянных, клиентов. Это 4к на поток. Пусть даже 1000 потков, это всего 4Мб. Если вы выжмете из сервера нагрузку в 1К клиентов и 1К потоков, что, мне кажется, маловероятным, то CopyOnWrite отожрет максимум 4Мб, а в реальности намного меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:04:44 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
BlazkowiczGorloPavelКакой такой момент? Тысячи пользователей работают... Подключаются и отключаются. Вы представляете что будет если на каждую сессию будет выделятся хотя бы 512кб ОЗУ? snapshot массива это только массив ссылок, а не полная глубокая копия. 4 байта на элемент. Вряд ли у вас будет более 1к постоянных, клиентов. Это 4к на поток. Пусть даже 1000 потков, это всего 4Мб. Если вы выжмете из сервера нагрузку в 1К клиентов и 1К потоков, что, мне кажется, маловероятным, то CopyOnWrite отожрет максимум 4Мб, а в реальности намного меньше. В данный момент более 4к. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:05:31 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelBlazkowicz NAT Punch-Through. Вы их так и не осилили? Когда вы приводили мне эти ссылки? Прошу прощения. Думал это ваша тема была: 12817225 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:06:21 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelВ данный момент более 4к. более 4к клиентов и более 4к потоков? Что там за железо такое в холостую молотит данные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:07:22 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Ок. Действительно. А что если их просто помечать как вы советовали. Ну и пусть они висят. А по таймеру блочить этот лист к примеру раз в 20 секунд чистить... ну а потом пусть все читают дальше... Ну а если будут проблемы с производительностью или памятью, то можно уменьшать или увеличивать таймер очистки. Как вы думаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:08:44 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, 2 ядра 2 гига. Занято всего ~800 метров ОЗУ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:09:48 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, К сожалению NAT Punch-Through как я понял нормально работает только с UDP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:13:02 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37880853&tid=2131337]: |
0ms |
get settings: |
17ms |
get forum list: |
25ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
57ms |
get topic data: |
20ms |
get forum data: |
5ms |
get page messages: |
102ms |
get tp. blocked users: |
3ms |
| others: | 322ms |
| total: | 563ms |

| 0 / 0 |
