|
|
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Кто имел дело с synchronizedList, посоветуйте пожалуйста. Проблема в следующем. Существует несколько потоков одни потоки добавляют в лист элементы, другие удаляют, а третьи просто перебирают их. Как их синхронизировать? Т.е как сделать так, чтобы когда один поток занимается своим делом, то другие ждут пока он его освободит. И можно ли для таких листов использовать foreach? Заранее огромное спасибо за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 14:27:55 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Можно циклы синхронизировать по той же коллекции. http://stackoverflow.com/a/1775738 Но лучше поискать более подходящую реализацию. Например посмотреть на CopyOnWriteArrayList. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 14:33:45 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
synchronizedList в этом случае не поможет. Тут либо CopyOnWriteArrayList, либо в зависимости от своей логики писать какие-нибудь блокировки руками (Latch, Lock, Barrier и т.д.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 14:34:37 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Кроме прочего можно и read\write операции к списку обезопасить без "синхронизации". Использовать ReadWriteLock и LinkedList, например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 14:35:36 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
BlazkowiczКроме прочего можно и read\write операции к списку обезопасить без "синхронизации". Использовать ReadWriteLock и LinkedList, например. Можно пример? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 14:38:56 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Так... Если использовать CopyOnWriteArrayList, то можно не парится и он сам позаботится о синхронизации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 14:40:40 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelТак... Если использовать CopyOnWriteArrayList, то можно не парится и он сам позаботится о синхронизации? Само по себе ничего не будет. Всё зависит от того как ваша система часто делает изменения и итерации. Вомзожно потери производительности на создание снэпшотов окажутся значительными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 14:42:26 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Очень часто перебор и удаление. И не должно быть ситуации когда один поток удалил элемент, а другой в этот момент перебирал и наткнулся на него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 14:46:04 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelМожно пример? Спасибо. Чего пример? Разберитесь что такое связанный список. Например поток добавляющий данные с головы, никак не мешает потоку удаляющему элемент с хвоста. Аналогично можно на массиве построить цикличный буфер. Даже быстрее будет. Мы же не знаем какая у вас супер задача и для чего этот список вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 14:47:36 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelBlazkowicz, Очень часто перебор и удаление. И не должно быть ситуации когда один поток удалил элемент, а другой в этот момент перебирал и наткнулся на него. Если у вас такие требования, то он вам не поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 14:47:59 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
schwa, Что посоветуете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 14:49:54 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelИ не должно быть ситуации когда один поток удалил элемент, а другой в этот момент перебирал и наткнулся на него. Это очень странное требование. Логически подумайте над ним. А что если поток который перебирал, обработает элемент на миллисекунду раньше чем другой поток его удалит? А если позже? А на что эта миллисекунда влияет в вашей системе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 14:50:32 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Ок... Сетевое приложение. TCP сервер. При подключении клиента создается экземпляр объекта(сессии) ссылка на который добавляется в synchronizedList, так же в этот объект(сессию) передается ссылка на этот самый лист. При отключении сессия должна вызвать synchronized функцию в которой произведет запись в БД, а потом удалить себя из списка. При этом еще живые сессии могут перебирать коллекцию этих самых сессий и взаимодействовать с ними. Как быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 14:55:25 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelschwa, Что посоветуете? Как ни странно, но CopyOnWriteArrayList :)) Только гарантию отсутствия повторной обработки сделать через какой-нибудь флаг в обрабатываемом объекте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 14:55:30 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
schwa, Очень критичны расходы на память. Как я понял при чтении списка будет создаваться копия объекта листа и производится перебор. Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 14:58:03 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
BlazkowiczА что если поток который перебирал, обработает элемент на миллисекунду раньше чем другой поток его удалит? А если позже? А на что эта миллисекунда влияет в вашей системе? Так.. Так вот я и спрашиваю. Как сделать так чтобы к примеру один из потоков читает список, то все остальные ждут. Независимо от того что они собираются делать. И наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:02:04 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelСетевое приложение. TCP сервер. При подключении клиента создается экземпляр объекта(сессии) ссылка на который добавляется в synchronizedList, так же в этот объект(сессию) передается ссылка на этот самый лист. При отключении сессия должна вызвать synchronized функцию в которой произведет запись в БД, а потом удалить себя из списка. При этом еще живые сессии могут перебирать коллекцию этих самых сессий и взаимодействовать с ними. Как быть? Вот видите. Становиться ясно что требование, которые вы описали выше, особого смысла не имеет. Ничего страшного, если юзер, который был залогинен несколько секунд назад, получит какие-то данные. Опять же можно пришить его соединение и он ничего не получит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:03:09 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelОчень критичны расходы на память. Как я понял при чтении списка будет создаваться копия объекта листа и производится перебор. Так? Т.е. производительность, можно сказать, не важна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:03:43 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelТак.. Так вот я и спрашиваю. Как сделать так чтобы к примеру один из потоков читает список, то все остальные ждут. Независимо от того что они собираются делать. И наоборот. 12872670 Только учтите что в таком случае у вас сервер будет поддерживать 40-50 одновременных сессий без видимых тормозов. А то и меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:05:26 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
И еще... В момент отключения и удаления элемента, если элемент связан с другим элементом, то он сообщает ему об этом. К примеру если потоки взаимодействуют друг с другом(существует друг на друга ссылка) и в один прекрасный момент один из них решил отключится и удалится из списка, то он сообщает об этом своему потоку-партнеру. Так что ничего страшного. Это работает уже довольно стабильно год. Но иногда возникают проблемы. Как я понял они связанны с синхронизацией. Хочется поправить этот момент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:05:39 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavel, Если Критична память, то java, давай, до свидания. Просто напишите тест и посмотрите сколько времени занимает занимает модификация листа с реальными данными. Это крайне преждевременная оптимизация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:10:11 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Попробую объяснить поподробнее. Приложение это это сервер который позволяет обходить NAT. Т.е соединять два TCP клиента. Представьте есть приложение сервер которое ставиться на ПК и приложение клиент которое ставится на смартфон. Приложение которое на ПК должно как-то себя определить и идентифицироваться клиентом. Так вот. Это приложение производит регистрацию на сервере путем создания пары логин-пароль который естественно сохраняется в БД. После оно авторизируется на этом сервере и на сервере создается объект(сессия-сокет) в котором есть поле которое определяет его тип Server(ПК) или Client(смартфон) и естественно добавляется в synchronizedList. Возникает момент когда клиент(самртфон) хочет подключиться к Server(ПК) он подключается к серверу(тот самый к которому подключаются все) на нем создается опять же объект(сессия-сокет) в поле которого определяется что он клиент. Далее он производит поиск по synchronizedList и ищет есть ли в списке тот самый подключенный ПК, если есть, то они обмениваются ссылками друг на друга и производят взаимодействие(обмен данными). Но вдруг возникает ситуация и один из них отключается... Тут-то и происходит удаление... А в этот момент кто-то ищет себе пару для взаимодействия. Надеюсь понятно объяснил. По такому типу работает такая замечательная программа как TeamViewer и подобные включая мое приложение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:17:33 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Сейчас используется конструкция типа Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Но как я понимаю этот путь неверный... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:21:33 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Понятно лишь от части. Потому что после того как сервер скомутировал двух клиентов, он может про них забыть. И те работают напрямую, пока соединение не отвалиться. Тогда они снова переподключаются через сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:22:48 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
И, снова, непонятно откуда требования в немедленном удалении. Клиенты никак не могут скомутироваться кроме как друг с другом. Соответственно если в списке находится мертвая сессия, в этом ничего страшного нет. Остальные могут спокойно этот список перебирать в поисках своего клиента. Вообще не до конца понятно назначение списк. Ведь клиенты обычно комутируются по некому уникальному ID. Зачем тут переобр списка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 15:26:02 |
|
||
|
Синхронизация 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 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavel2 ядра 2 гига. Занято всего ~800 метров ОЗУ. Ну, то есть, не более 4х одновременно активных потоков? При списке в 4К это 128Кб расходов на CopyOnWrite ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:13:43 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelК сожалению NAT Punch-Through как я понял нормально работает только с UDP. http://en.wikipedia.org/wiki/TCP_hole_punching ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:14:57 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Ну как не более... Кол-во растет. Т.е вы хотите сказать что при >4000 сокет-потоков при том что каждый будет работать с этим листом CopyOnWrite будет занимать не более мегабайта ОЗУ? И еще... Я немного не понял про CopyOnWrite... Не получится так, что один поток уже удалил элемен, а другой имеет копию листа с неудаленным элементом и будет расценивать его как живой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:18:12 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelНу как не более... Кол-во растет. Т.е вы хотите сказать что при >4000 сокет-потоков при том что каждый будет работать с этим листом CopyOnWrite будет занимать не более мегабайта ОЗУ? У вас мало ядер. Соответственно не так много потоков будут бороться за этот список. Даже если у вас в JVM 4К потоков, из них активных только 4, ну и побороться за ресурс смогут максимум 10-20. И то - врядли, переключение контекста не на столько часто, как мне кажется, будет происходить. GorloPavelИ еще... Я немного не понял про CopyOnWrite... Не получится так, что один поток уже удалил элемен, а другой имеет копию листа с неудаленным элементом и будет расценивать его как живой? Давайте не путать понятия. Живой- не живой это в вашей доменной модели. Да. Итератор, будет видеть элемент удаленный другим потоком. Но, как я уже несколько раз писал выше, это не критично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:27:41 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Но, как я уже несколько раз писал выше, это не критично. Ну как же не критично? Ведь при переборе объектов один клиент может с коммутироваться с другим, которого уже нет! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:30:24 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Вы сами использовали TCP hole punching? Т.е это позволит мне подключать две стороны peer-to-peer которые(оба) находятся за NAT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:32:13 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelНу как же не критично? Ведь при переборе объектов один клиент может с коммутироваться с другим, которого уже нет! Вы это должны предусмотреть в момент комутации. Потому что клиент может издохнуть уже после того как вы перебрали список, но до того как начали использовать, несмотря ни на какую синхронизацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:32:13 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelВы сами использовали TCP hole punching? Т.е это позволит мне подключать две стороны peer-to-peer которые(оба) находятся за NAT. Skype и TeamViewer именно так и работают. Нет никакого центрального сервера, который прокачивает все данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:33:56 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
BlazkowiczПотому что клиент может издохнуть уже после того как вы перебрали список Как? Ведь когда список заблокирован на удаление его не могут читать... И наоборот. Ну к примеру ситуация... Один поток издыхает, но не успел удалиться из списка и ждет когда ему отдадут список, а второй поток который читает видит что он еще в списке и передает ему ссылку на себя. И тут он заканчивает читать список и управление передается тому потоку который не успел помереть и тут он видит что ему уже передана ссылка на клиента... synchronized (sessions) { //---ТУТ ОН ПОНЯЛ ЧТО ОН СВЯЗАН //ПОСЛАЛ КОМПАНЬОНУ ИНФУ О ТОМ ЧТО ЕГО УЖЕ НЕТ //Удалил себя из списка sessions } Так нельзя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:38:34 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:42:15 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
BlazkowiczSkype и TeamViewer именно так и работают. Нет никакого центрального сервера, который прокачивает все данные. Ок. Спасибо за наводку. Теперь осталось найти реализацию всего этого на java и C#. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:43:16 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:45:26 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
А так? Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:50:23 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelНе понял. 1..4, 7 - один поток 5, 6 - второй поток ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:55:49 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, И? Посмотрите мою версию. Что не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 16:58:24 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelИ? Посмотрите мою версию. Что не так? Я не понял идею. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 17:21:33 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Поток 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; } А так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 17:31:19 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Кстати.. Нет реализации TCP_hole_punching под .NET. А нужен :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 17:35:53 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavel, UPnP еще не все роутеры поддерживают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2012, 17:55:05 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, А трафик все равно придется гонять через сервер. Попробовал UPnP... Сработало! Но при включенном брадмауэре или другом файрволе такое не прокатывает. Т.к они не позволяют в большинстве случаев послать широковещалку для обнаружения роутера и последующей настройки UPnP. Но как бы там ни было эта возможность значительно снизит нагрузку на сервер. Спасибо вам за наводку! Вы мне очень помогли ! Ну а с листами пока повоюю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2012, 04:31:57 |
|
||
|
Синхронизация synchronizedList
|
|||
|---|---|---|---|
|
#18+
GorloPavelкак сделать так, чтобы когда один поток занимается своим делом, то другие ждут пока он его освободит. И можно ли для таких листов использовать foreach? foreach использовать можно. GorloPavelНо как я понимаю этот путь неверный... Отчего же вы так понимаете? Для изначально сформулированной задачи это именно что классический верный путь. Другое дело, что он может не подойти по производительности, так как полностию исключает параллельную работу со списком. Чтобы разрешить частично параллельную работу, можно отдельно синхронизировать читателей и писателей (несколько читателей работают одновременно) - для этого вместо synchronized использовать Reentrantlock. Чтобы еще более распарелелить работу со списком, уже надо вникать в конкретные требования. В общем случае, нарисуйте сеть Петри чтобы увидеть все параллельные (и последовательные) места. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2012, 08:54:22 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2131337]: |
0ms |
get settings: |
16ms |
get forum list: |
18ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
50ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
131ms |
get tp. blocked users: |
2ms |
| others: | 306ms |
| total: | 553ms |

| 0 / 0 |
