在Java中,我应该先在本地复制一个volatile参考

Mik*_*e Q 14 java foreach multithreading volatile

如果我有以下内容

private volatile Collection<Integer> ints;

private void myMethod()
{
   for ( Integer i : ints )
   {
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

int集合永远不会改变,但整个集合可能被另一个线程所取代(所以它是一个不可变的集合).

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

编辑:此问题与foreach如何在内部工作的其他信息相关.

Shi*_*iSi 13

你不必.隐式地,代码将ints.iterator()无论如何都会执行,并且从那时起仅在旧集合上使用迭代器.