2016-05-21 5 views
0

1.6 Javadoc на этом не ясно. В чем разница междуВ чем разница между использованием synchronizedCollection и просто синхронизированной (сборкой)?

List l = LinkedList(); 
synchronized (l) { 
    l.add... // do some work 
    l.set... 
    l.remove... 
} 

против

List l = LinkedList(); 
Collection c = Collections.synchronizedCollection (l); 
synchronized (c) { 
    c.add...; c.set....; c.remove... 
} 

??? Зачем нужен класс synchronizedCollection? Что не так с первым методом?

ответ

2

Что не так с первым методом?

В этом нет ничего плохого: пока вы синхронизируете весь доступ, ваша программа будет выполнять, как ожидалось.

Зачем нужен класс synchronizedCollection?

В случае, если вы собираетесь использовать его внутри synchronized блока, нет никаких причин, действительно: дополнительная синхронизация внутри коллекции не собирается блокировать другие читатель и писатель, потому что synchronized блока уже делает это.

Причина в использовании synchronizedCollection заключается в том, чтобы избежать synchronized блоков. Вызов add, set и remove без синхронизации не оставит вашу коллекцию в недопустимом состоянии.

Однако в отсутствие блока synchronized вне операторов три отдельные операции не будут выполняться как атомный блок.

+0

Но в соответствии с javadoc: если несколько потоков обращаются к связанному списку одновременно, и по крайней мере один из потоков модифицирует список структурно, он должен быть синхронизирован извне. .... ЭТО ТИПИЧНО ПРОИЗОШЛО СИНХРОНИЗИРОВАНИЕ НА НЕКОТОРЫХ ОБЪЕКТАХ, ЧТО ЕСТЕСТВЕННО ЭКСПЕРИРУЕТ СПИСОК. Если такой объект не существует, список должен быть «завернут» с использованием метода Collections.synchronizedList. Итак, вот что я не понимаю, почему javadoc говорит, что синхронизация обычно выполняется на инкапсулирующем объекте, а не на сам связанный объект списка? –

+0

@FaiLau Объект, возвращенный 'synchronizedCollection', является * не * связанным списком. В нем есть связанный список, но это специальный класс, который добавляет свою собственную синхронизацию, прежде чем вызывать фактический список. – dasblinkenlight

+0

ОК, я понял. SyncrhonizedCollection возвращает потокобезопасный фасад в содержащий класс. Но возвращаемый объект является потокобезопасным, а не параллельным. Поэтому, когда используется итератор, объект еще нужно синхронизировать. –

Смежные вопросы