Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / От чего спасают синхронизованные коллекции? / 12 сообщений из 12, страница 1 из 1
27.03.2014, 11:21
    #38597832
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
От чего спасают синхронизованные коллекции?
Когда объясняют синхронизованные коллекции и зачем они нужны по-моему больше эмоций чем здравого смысла.

вот сделали мы что-то типа
Код: java
1.
List<String> list = Collections.synchronizedList(new ArrayList<String>());



Чем это отличается от обычного ArrayList ?

что будет если один поток одновременно, скажем, будет добавлять, а другой читать?
...
Рейтинг: 0 / 0
27.03.2014, 11:45
    #38597875
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
От чего спасают синхронизованные коллекции?
questionerКогда объясняют синхронизованные коллекции и зачем они нужны по-моему больше эмоций чем здравого смысла.
То есть, если не понятно, то все вокруг истерички? Интересная позиция.

questionerчто будет если один поток одновременно, скажем, будет добавлять, а другой читать?
Если не использовать итераторы, а только методы коллекций, то в синхронизированой колекции они будут исполнять по очереди.
Использование же обычного ArrayList в многопоточном окружении может привести к непредсказуемым результатам. Перечислать все возможные варианты как оно может сломаться бесполезно.
Например два потока одновременно добавляют элемент, при этом массив внутри ArrayList необходимо расширить. Это закончиться тем что два потока создадут две копии массива и добавят туда свои элементы. А после присвоения в поле, останется доступным лишь одинм массив. Данные добавленные другим потоком пропадут.
Даже без расширения массива, при одновременной записи можно записать два элементы в одну позиуицю.

Если же ограничиться тем, что только один поток пишет и только один поток читает, то проблем, конечно будет меньше. Но нельзя сказать что их не будет совсем. Основная проблема в том что читающий поток может не сразу увидеть то что уже записано. Либо при итерации читатель будет рассчитывать на N элементов. А массиве уже будет меньше. Что приведет к выходу за пределы массива.

Конечно, же, можно огранизовать чтение и запись таким образом чтобы ничего этого не происходило. Пример такого подхода - циклический буфер. Просто там используются другие механизмы синхронизации.

Обычный Collections.synchronized нужен в том случае, если потоки скорее всего конкурировать не будут. Но вероятность того что возможен параллельный доступ не нулевая.
...
Рейтинг: 0 / 0
27.03.2014, 12:43
    #38597963
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
От чего спасают синхронизованные коллекции?
Blazkowicz,

BlazkowiczТо есть, если не понятно, то все вокруг истерички? Интересная позиция.

я такого не говорил)

BlazkowiczЕсли же ограничиться тем, что только один поток пишет и только один поток читает, то проблем, конечно будет меньше. Но нельзя сказать что их не будет совсем. Основная проблема в том что читающий поток может не сразу увидеть то что уже записано. Либо при итерации читатель будет рассчитывать на N элементов. А массиве уже будет меньше. Что приведет к выходу за пределы массива.


это про синхронизованный или обычный List ?
...
Рейтинг: 0 / 0
27.03.2014, 12:45
    #38597966
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
От чего спасают синхронизованные коллекции?
questionerя такого не говорил)

А какие тогда эмоции? Грусть и печаль? :D

questionerэто про синхронизованный или обычный List ?
Это про ArrayList.
...
Рейтинг: 0 / 0
27.03.2014, 13:14
    #38598017
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
От чего спасают синхронизованные коллекции?
Blazkowicz,
BlazkowiczА какие тогда эмоции? Грусть и печаль? :D
типо если использовать в многопоточной среде обычные коллекции - будет ба-бах, ты-дышь и вообще чуть ли не ядерная война начнётся..
BlazkowiczЕсли не использовать итераторы, а только методы коллекций, то в синхронизированой колекции они будут исполнять по очереди.

То есть синхронизованные коллекции решают за нас проблемы описанные вами проблемы, но
1. Не спасают от итераторных ConcurrentModificationExcreption?
2. Производительность падает
?
...
Рейтинг: 0 / 0
27.03.2014, 13:19
    #38598037
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
От чего спасают синхронизованные коллекции?
questionerтипо если использовать в многопоточной среде обычные коллекции - будет ба-бах, ты-дышь и вообще чуть ли не ядерная война начнётся..

Нет. Просто появится непредсказуемое поведение. Например баги, которые нельзя воспроизвести, соответсвенно нельзя установить их источник. Соответсвенно нет и возможности их исправить. Потому что у юзера они вылазять регулярно, а девелопер на это отвечает "у меня всё работает".


questioner1. Не спасают от итераторных ConcurrentModificationExcreption?
ConcurrentModificationExcreption к многопоточности отношения не имеет.

questioner2. Производительность падает?
Зависит от сценария использования и реализации. Например Biased Locking оптимизация делает synchronized почти бесплатным, пока он используется единственным потоком.
...
Рейтинг: 0 / 0
27.03.2014, 14:26
    #38598134
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
От чего спасают синхронизованные коллекции?
Blazkowicz,

BlazkowiczConcurrentModificationExcreption к многопоточности отношения не имеет.

к потокам доступа к коллекци
...
Рейтинг: 0 / 0
27.03.2014, 14:32
    #38598138
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
От чего спасают синхронизованные коллекции?
questionerк потокам доступа к коллекци
Это какой-то особый под-вид потоков? :)
...
Рейтинг: 0 / 0
27.03.2014, 14:32
    #38598140
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
От чего спасают синхронизованные коллекции?
Лучше для примера взять HashMap.

Замените в коде ConcurrentHashMap или Collections.synchronizedMap(..) на простой HashMap.
И ждите того момента, когда все потоки, которые как-то этот код с этой мапой используют конкурентно (один делает put, а другой get), застрянут в бесконечных циклах.

Конечно находятся люди, которые подобные проблемы решают просто убив сервер, а потом его перезапустив... И никаких проблем с потокобезопасностью в их коде как бы вообще нет.
...
Рейтинг: 0 / 0
27.03.2014, 17:11
    #38598331
GregTk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
От чего спасают синхронизованные коллекции?
schwaКонечно находятся люди, которые подобные проблемы решают просто убив сервер, а потом его перезапустив... И никаких проблем с потокобезопасностью в их коде как бы вообще нет.

Чувствуется что наболело у человека :)
...
Рейтинг: 0 / 0
27.03.2014, 21:31
    #38598544
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
От чего спасают синхронизованные коллекции?
Blazkowiczquestionerк потокам доступа к коллекци
Это какой-то особый под-вид потоков? :)
ну Concurrent же!))
...
Рейтинг: 0 / 0
27.03.2014, 22:10
    #38598560
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
От чего спасают синхронизованные коллекции?
questioner,

От гонок он спасает.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / От чего спасают синхронизованные коллекции? / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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