Обычно нет, потому что в этом случае вы не изменяете внутреннее состояние коллекции. Когда вы выполняете итерацию по коллекции, создается новый экземпляр итератора, и состояние итерации соответствует экземпляру итератора.
Примечание: Помните, что, сохраняя коллекцию, доступную только для чтения, вы только предотвращаете модификации самой коллекции. Каждый элемент коллекции по-прежнему можно изменить.
class Test {
public Test(final int a, final int b) {
this.a = a;
this.b = b;
}
public int a;
public int b;
}
public class Main {
public static void main(String[] args) throws Exception {
List<Test> values = new ArrayList<Test>(2);
values.add(new Test(1, 2));
values.add(new Test(3, 4));
List<Test> readOnly = Collections.unmodifiableList(values);
for (Test t : readOnly) {
t.a = 5;
}
for (Test t : values) {
System.out.println(t.a);
}
}
}
Это выводит:
5
5
Важные замечания от @WMR answer.
Это зависит от того,
чтение вашей коллекции началось
до или после заполнения. Если
они начались, прежде чем заполнить его,
у вас нет никаких гарантий (без
синхронизирую), что эти темы
когда-нибудь увидит обновленные значения.
Причиной этого является память Java
Модель, если вы хотите узнать больше, прочитайте
раздел «Видимость» по этой ссылке:
http://gee.cs.oswego.edu/dl/cpj/jmm.html
И даже если потоки запущены
после того, как вы заполните свою коллекцию, вы
возможно, придется синхронизировать, потому что ваш
реализация коллекции может измениться
его внутреннее состояние даже на чтение
операции (спасибо Майкл
Бар-Sinai ,
Я не знал таких коллекций
существовало).
Еще одно очень интересное чтение на
тема параллелизма, которая охватывает
такие темы, как публикация объектов,
видимость и пр. гораздо подробнее
книга Брайана Гетца Ява
Параллелизм в
Практика .