2012-02-15 4 views
0

同じオブジェクトを異なるCallableに渡してからExecutorServiceに渡すと、オブジェクトのメンバはスレッドセーフですか?私の例では、クラシファイアは、トレーニングデータ、テストデータ、およびネットワークのプロパティを持っています。すべては、Classableのメソッドを呼び出すことによってCallableのcall()メソッド内で使用されます。同じ分類子オブジェクトが各Callableに渡されます。私は、例えばデバッグするときので、私は感じているClassifierCallableオブジェクトメンバはCallable&ExecutorServiceのスレッドセーフです

public XVErrors call() throws Exception { 
     XVErrors xv = new XVErrors(); 
     xv.addTrainingError(classifier.train()); 
     xv.addTestError(classifier.test()); 
     return xv; 
    } 

for (int i = 0; i < this.cvCount; i++) 
    { 
    classifier.setTrainingsData(getTrainingSet(i, testSize)); 
    classifier.setTestData(getTestSet(i, testSize)); 
    Callable<XVErrors> callable = new ClassifierCallable<Classifier>(classifier); 
    Future<XVErrors> t = this.executor.submit(callable); 
    this.results.add(t); 
    } 

...私は、分類子オブジェクトのディープコピーを行うと、それを渡す必要があるだろう私が訓練を終えた後、train()メソッドのネットワークエラーは異なっています(tmpとtmp2は異なります)。

public TrainingError train{... 

do { 
    trainingAlgorithm.iteration(); 
    epoch++; 
    double tmp = trainingAlgorithm.getError(); 
} while (tmp > trainingErrorThreshold); 

double tmp2 = trainingAlgorithm.getError(); 
... 
} 

答えて

0

オブジェクトがどのように実装されているかによっては、明らかに十分です。オブジェクトに複数のスレッドがアクセスすることが予想される場合は、それらのアクセスをスレッドセーフにする方法を理解することは自分の責任です。

+0

上記のように、私はそれらを独立して処理したい場合は、各Callableのための新しいクラシファイアオブジェクトを作成する必要があります。それ以外の場合、スレッドは同じオブジェクトメンバを変更します。 –

+0

あなたのオブジェクトによって異なります!必要に応じてスレッドセーフなものにすることができれば、そうすることができます。あなたのユースケースについてもっと詳しく教えない限り、その質問に本当に答えることはできません。 –

関連する問題