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

时间:2013-08-15 16:44:58

标签: 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..7]
Thread 2 reads data[8..n]

6 个答案:

答案 0 :(得分:6)

多个线程读取数组(或任何其他集合,对象的字段等)的内容是线程安全的,前提是数据不会在此期间被修改。

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

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

旁注:使用不可变集合可能是个好主意。这样你就不会有任何修改。我建议使用这样的包装器。检查java.util.concurrent.atomic包,应该可以使用。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

如果确保所有线程都只是读取,则其线程安全。虽然你不应该依赖那个事实alone并尝试通过包装器使你的数组​​不可变。

答案 3 :(得分:0)

当然,如果您只想阅读它,请在创建时将数组传递给线程。只要您不修改,就不会有任何问题。

答案 4 :(得分:0)

从数组数组中读取是线程安全操作,但是如果要修改数组而不是考虑使用类AtomicIntegerArray

答案 5 :(得分:0)

考虑填充ConcurrendLinkedQueue并让每个线程从中拉出来。这将确保不存在并发问题。

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