|
|
|
Синхронизация 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?fid=59&msg=37880929&tid=2131337]: |
0ms |
get settings: |
10ms |
get forum list: |
25ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
70ms |
get topic data: |
20ms |
get forum data: |
6ms |
get page messages: |
94ms |
get tp. blocked users: |
3ms |
| others: | 305ms |
| total: | 547ms |

| 0 / 0 |
