В Java я должен скопировать переменную ссылку локально, прежде чем я ее - PullRequest
14 голосов
/ 21 декабря 2010

Если у меня есть следующее

private volatile Collection<Integer> ints;

private void myMethod()
{
   for ( Integer i : ints )
   {
      ...
   }
}

Коллекция ints никогда не изменяется, но вся коллекция может быть заменена другим потоком (так что это неизменяемая коллекция).

Должен ли я копировать переменную ints локально, прежде чем итерировать ее? Я не уверен, что к нему будут обращаться несколько раз. т.е. итерация коллекции, другой поток заменяет коллекцию, код продолжает итерацию, но с новой коллекцией.

РЕДАКТИРОВАТЬ : Этот вопрос имеет отношение к дополнительной информации о том, как foreach работает внутри.

Ответы [ 3 ]

13 голосов
/ 21 декабря 2010

Вам не нужно.Неявно, код все равно будет делать ints.iterator(), и с этого момента использовать этот итератор только в старой коллекции.

2 голосов
/ 21 декабря 2010

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

Так что он не будет переключать коллекции в середине цикла.

0 голосов
/ 21 декабря 2010

Не думаю, что ребята правы. Это верно, что вы перебираете, используя итератор, полученный один раз. Но если целевая коллекция изменяется во время вашей итерации, вы получаете ConcurrentModificationException. Вы можете легко попробовать это. Я считаю, что если ваша коллекция может быть изменена, вы должны отслеживать это путем синхронизации.

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