|
|
|
Синхронизация 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 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37880704&tid=2131337]: |
0ms |
get settings: |
15ms |
get forum list: |
26ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
51ms |
get topic data: |
16ms |
get forum data: |
4ms |
get page messages: |
86ms |
get tp. blocked users: |
3ms |
| others: | 289ms |
| total: | 504ms |

| 0 / 0 |
