Мы все знаем при использовании Collections.synchronizedXXX
(например, synchronizedSet()
), мы получаем синхронизированный "вид" базовой коллекции.
Однако в документе этих методов генерации оболочки указано, что мы должны явно синхронизировать с коллекцией при итерации коллекций с использованием итератора.
Какой вариант вы решите решить эту проблему?
Я могу видеть только следующие подходы:
- Сделайте это, как указано в документации: синхронизация в коллекции
- Клонирование коллекции перед вызовом
iterator()
- Используйте коллекцию, в которой итератор потокобезопасен (я знаю только
CopyOnWriteArrayList
/Set)
И в качестве бонусного вопроса: при использовании синхронизированного представления - это использование foreach/Iterable thread-safe?