Только не позволяйте никому (кроме объекта, содержащего вектор) обращаться к вектору. Это единственный способ убедиться, что никто, кроме удерживающего объекта, не изменяет его во время итерации.
Вернуть и передать копии вектора из методов удерживающего объекта или вернуть / передать неизменяемую версию (используя Collections.unmodifiableList()
). Возвращение неизменяемого списка, конечно же, нарушит код, выполняющий вызов retainAll
.
Примечание: Vector
устарело и больше не должно использоваться. Как вы только что заметили, тот факт, что он синхронизирован, не защищает вас от ошибок одновременного доступа. Так что лучше использовать ArrayList
.