Java 从阵列同时读取是否是线程安全的?

Java 从阵列同时读取是否是线程安全的?,java,arrays,multithreading,Java,Arrays,Multithreading,我有一个数组,其中包含如下声明的整数值: int data[] = new int[n]; 每一个值都需要处理,我将工作分割成若干部分,这样就可以由单独的线程来处理。在处理过程中不会修改阵列 所有处理线程能否同时读取阵列的各个部分?还是我必须用锁 换句话说:这个工作单是线程安全的吗 Array is created and filled Threads are created and started Thread 0 reads data[0..3] Thread 1 reads data[4

我有一个数组,其中包含如下声明的整数值:

int data[] = new int[n];
每一个值都需要处理,我将工作分割成若干部分,这样就可以由单独的线程来处理。在处理过程中不会修改阵列

所有处理线程能否同时读取阵列的各个部分?还是我必须用锁

换句话说:这个工作单是线程安全的吗

Array is created and filled
Threads are created and started
Thread 0 reads data[0..3]
Thread 1 reads data[4..7]
Thread 2 reads data[8..n]

多线程读取数组(或任何其他集合、对象字段等)的内容是线程安全的,前提是同时不修改数据

如果用要处理的数据填充数组并将其传递给不同的线程进行读取,那么数据将被正确读取,并且不可能发生数据争用

请注意,只有在填充数组后创建线程时,这才有效。如果将要处理的数组传递给某些已存在的线程而不进行同步,则可能无法正确读取数组的内容。在这种情况下,线程获取数组引用的方法应该同步,因为同步块强制线程之间进行内存更新


另一方面:使用不可变集合可能是个好主意。这样,您就可以确保甚至不可能进行任何修改。我建议使用这种包装。检查
java.util.concurrent.atomic
包,应该有可以使用的东西。

只要线程不修改数组中的内容,就可以从多个线程读取数组

如果您确保所有线程都在读取,那么它是线程安全的。尽管您不应该仅仅依赖于这个事实,并尝试通过包装器使数组不可变。

当然,如果您只是想读取它,请在创建线程时将数组传递给线程。不会有任何问题,只要你没有<强>修改< /强>它。

从数组数组中读取是线程安全的操作,但是如果你正在修改数组而不考虑使用类。

考虑填充A并使每个线程从中拔出。这将确保没有并发问题


您的每个线程都将从队列顶部提取数据并进行处理。

任何数量的线程都可以读取值。关键部分只有在涉及写作或阅读时才重要!对结构的迭代应该是同步的。如果你的结构被视为不可变的,也就是说,没有写入内部数据或结构本身,你就不需要同步它。除非当你从中读取时,你的结构发生了变化,但是在数组的情况下,这种情况永远不会发生。@williammerrison这个问题怎么会与你所发现的重复呢?这是另一种情况。谢谢你的快速回复。我在想,如果反过来也是可能的话,线程可以同时对的。(这些线程永远不会对同一个索引正确)@user2342875你是说write?如果您从不同的线程写入不同的内存位置,如果您不使用同步,您将永远无法确定是否正确(使用新值)从不同的线程读取内存。同步还确保线程之间的内存同步。@user2342875我修改了我的答案,并提到了一个潜在的陷阱;在你的代码中考虑它。