在Java中,我应该在放弃之前在本地复制一个易失性引用吗?

2022-09-04 03:05:17

如果我有以下情况

private volatile Collection<Integer> ints;

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

ints 集合永远不会更改,但整个集合可能会被另一个线程替换(因此它是一个不可变的集合)。

在迭代 ints 变量之前,我应该在本地复制它吗?我不确定它是否会被多次访问。即迭代集合,另一个线程替换集合,代码继续迭代,但使用新集合。

编辑这个问题与有关foreach如何在内部工作的其他信息有关。


答案 1

您不必这样做。隐式地,代码无论如何都会执行一个,并且从那时起,只在旧集合上使用该迭代器。ints.iterator()


答案 2

应该不是必需的,因为 for 循环将获取一次迭代器并循环访问该迭代器。该迭代器与创建它的集合相关联。

因此,它不会在中途切换集合。