удобство использования синхронизированных ... методов в java.util.Collections - PullRequest
3 голосов
/ 18 января 2010

Я смотрю на статический метод

Collections.synchronizedList(List<T> list)

Джавадок говорит

Крайне важно, чтобы пользователь вручную синхронизировал возвращаемый список при итерации по нему ...

Какова цель создания синхронизированного списка, если мне все еще нужно синхронизировать его вручную?

Ответы [ 2 ]

7 голосов
/ 18 января 2010

Причина, по которой вы бы использовали

Collections.synchronizedList(List<T> list)  

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

synchronized(list) {
    list.add(type);
}   

Вместо этого вы можете просто сделать

list.add(type);  

, и это будет потокобезопасным.

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

1 голос
/ 18 января 2010

В руководстве java collection это объясняется. По сути, каждая итерация восстанавливает несколько вызовов базовой коллекции. Эти вызовы должны быть атомизированы как одна «транзакция».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...