Java 在线程之间共享的数组上迭代

Java 在线程之间共享的数组上迭代,java,arrays,multithreading,Java,Arrays,Multithreading,我有一个数组,它的大小在程序执行期间不会改变。假设有多个线程正在更改这个数组的内容,比如 array[validIndex] = new Entity(); 在任何时间点遍历这样的数组是否安全?假设我不关心数组中的对象。Java中的数组大小永远不会改变 遍历数组本质上就是遍历数组索引并获取每个索引处的元素——无论是显式执行,还是使用闪亮的for(Entity e:array).语法——因此即使更改数组内容,迭代本身也不会出错 在迭代过程中,您将看到的对象可能不会在任何给定时间点构成数组内容的有

我有一个数组,它的大小在程序执行期间不会改变。假设有多个线程正在更改这个数组的内容,比如

array[validIndex] = new Entity();

在任何时间点遍历这样的数组是否安全?假设我不关心数组中的对象。

Java中的数组大小永远不会改变

遍历数组本质上就是遍历数组索引并获取每个索引处的元素——无论是显式执行,还是使用闪亮的
for(Entity e:array).
语法——因此即使更改数组内容,迭代本身也不会出错


在迭代过程中,您将看到的对象可能不会在任何给定时间点构成数组内容的有效“快照”,但据我所知,在您的情况下,这不是一个问题。

Java中的数组大小永远不会改变

遍历数组本质上就是遍历数组索引并获取每个索引处的元素——无论是显式执行,还是使用闪亮的
for(Entity e:array).
语法——因此即使更改数组内容,迭代本身也不会出错


在迭代过程中,您将看到的对象可能不会在任何给定时间点构成数组内容的有效“快照”,但据我所知,在您的情况下,这不是一个问题。

您可以按如下方式使数组线程安全:

list arryList=new ArrayList(); list arratListNew=Collections.synchronizedList(arrayList)


//此处arratListNew将是线程安全阵列。

您可以按如下方式使阵列线程安全:

list arryList=new ArrayList(); list arratListNew=Collections.synchronizedList(arrayList)


//这里的arratListNew将是线程安全数组。

虽然对数组的读写是原子的,但据我记忆,数组元素并不是易变的,因此一个线程可能不会立即(或完全取决于您的程序结构)看到另一个线程所做的更改。如果这是一个问题,你可以使用像AtomicReferenceArray这样的类,或者使用同步块。如果你不关心里面的对象,为什么要遍历数组?@user2357112显然我想访问它们,我想说的是,它们的顺序不重要,我对数组的任何特定“快照”都不感兴趣。虽然对数组的读取和写入是原子的,但根据我的记忆,数组元素并不是易变的,因此一个线程可能不会立即(或者完全取决于您的程序结构)看到另一个线程所做的更改。如果这是一个问题,你可以使用像AtomicReferenceArray这样的类,或者使用同步块。如果你不关心里面的对象,为什么要遍历数组?@user2357112显然我想访问它们,我想说的是,它们的顺序不重要,我对阵列的任何特定“快照”都不感兴趣。没有阵列访问的同步是一个问题。考虑一个场景,数组的所有赋值都在线程<代码> A<代码>中,数组中的所有读取都在线程<代码> B<代码>中。无论线程
A
存储了多少引用,线程
B
可能总是只能看到
null
值,除非存在某种同步。@Lew Bloch首先指出,OP“不关心数组中的对象”,所以任何一致性点都是没有意义的。另一方面,我既不能完全理解您的示例,也不能想象它与同步有什么关系。如果线程之间没有任何事件发生,就无法保证它们之间的内存可见性。螺纹
A
理论上​无法完成对任何或所有数组元素的写入,其他线程无法看到写入的值,只能看到数组的初始状态。如果没有某种形式的同步,程序就无法建立必要的同步。这对你来说清楚吗,@shinobi?@Lew Bloch是的,现在我明白你的意思了,在最初的问题中,这仍然是一个没有同步阵列访问的问题。考虑一个场景,数组的所有赋值都在线程<代码> A<代码>中,数组中的所有读取都在线程<代码> B<代码>中。无论线程
A
存储了多少引用,线程
B
可能总是只能看到
null
值,除非存在某种同步。@Lew Bloch首先指出,OP“不关心数组中的对象”,所以任何一致性点都是没有意义的。另一方面,我既不能完全理解您的示例,也不能想象它与同步有什么关系。如果线程之间没有任何事件发生,就无法保证它们之间的内存可见性。螺纹
A
理论上​无法完成对任何或所有数组元素的写入,其他线程无法看到写入的值,只能看到数组的初始状态。如果没有某种形式的同步,程序就无法建立必要的同步。“希诺比,这对你来说清楚了吗?”@Lew Bloch是的——现在我明白你的意思了,在原始问题的上下文中,这仍然是没有意义的。ArrayList不是数组。ArrayList不是数组。