简单来说,我的问题如下:
我有一个名为Test的类,它有3个双数组,分别命名为array1、array2、array3(假设它们的长度相同)。它有一个名为Estep的主要函数,我需要用多线程来实现这个函数来改进速度。
在Estep中,我需要修改array1和array2,而array3仅供读取。我定义了一个名为which_array的指示变量来指示要修改哪个数组。我将三个数组传递给Estep并修改array1和array2。
我的代码如下,我对其进行了测试,它工作正常,因为 Estep 中 array1 和 array2 的修改可以在 Test 类中看到。但我仍然怀疑它是否绝对正确。我想知道是否应该将volatile添加到 Test 类中的三个 array1 中,还是需要一些同步机制?
任何意见,将不胜感激!
public class Test{
double[] array1;
double[] array2;
double[] array3;
//for simplifization, I omitted the code for allocation and initialization of the the arrays.
public void EstepInTest()
{
final CountDownLatch countdown = new CountDownLatch(2);
Estep modifyArray1 = new Estep(array1, array2, array3, 1,countdown);
Thread t1 = new Thread( firstHalf);
t1.start();
Estep modifyArray2 = new Estep(array1, array2, array3, 2,countdown);
Thread t2 = new Thread(secondHalf);
t2.start();
try{
countdown.await();
}catch (InterruptedException e) {
e.printStackTrace();
}
//do next things
}
}
class Estep implements Runnable{
double[] array1;
double[] array2;
double[] array3;
int which_array;
Estep(double[] array1, double[] array2, double[] array3, int which_array, CountDownLatch cd)
{
this.array1 = array1;
this.array2 = array2;
this.array3 = array3;
this.which_array = which_array;
this.cd = cd;
}
public void run(){
if( this.which_array == 1){
for( int i = 0; i < array1.length; ++i )
{
array1[i] = array1[i] + array3[i];
}
}else{
for( int i = 0; i < array2.length; ++i )
{
array2[i] = array2[i] + array3[i];
}
}
cd.countDown();
}