use*_*875 8 java arrays multithreading
我有一个数组,其中包含声明如下的整数值:
int data[] = new int[n];
Run Code Online (Sandbox Code Playgroud)
每个值都需要处理,我将工作分成几部分,以便它可以由不同的线程处理.处理期间不会修改数组.
所有处理线程可以同时读取数组的不同部分吗?或者我必须使用锁?
换句话说:这个工单是否是线程安全的?
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]
Run Code Online (Sandbox Code Playgroud)
通过多个线程读取数组(或任何其他集合,对象的字段等)的内容是线程安全的,前提是在此期间不修改数据.
如果用数据填充数组进行处理并将其传递给不同的线程进行读取,那么将正确读取数据并且不会有数据争用.
请注意,这只有在填充数组后创建线程时才有效.如果将数组传递给某些已存在的线程而没有同步,则可能无法正确读取数组的内容.在这种情况下,线程获得对数组的引用的方法应该是同步的,因为同步块强制线程之间的内存更新.
旁注:使用不可变集合可能是个好主意.这样你就不会有任何修改.我建议使用这样的包装器.检查java.util.concurrent.atomic
包装,应该有一些你可以使用的东西.