Являются ли элементы объекта потокобезопасными, если я передаю один и тот же объект в разные Callables, а затем в ExecutorService? В моем примере классификатор имеет свойства данных обучения, тестовых данных и сети. Все они используются в методе call() Callable, вызывая методы классификатора. Один и тот же объект классификатора передается каждому Callable.Являются ли члены объектов потоками безопасными для Callable & ExecutorService
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);
}
... в ClassifierCallable
public XVErrors call() throws Exception {
XVErrors xv = new XVErrors();
xv.addTrainingError(classifier.train());
xv.addTestError(classifier.test());
return xv;
}
У меня есть чувство, что я должен был бы сделать глубокую копию объекта классификаторов и передать его, потому что, когда я отладки, например, метод train(), сетевая ошибка отличается после завершения обучения (tmp и tmp2 разные).
public TrainingError train{...
do {
trainingAlgorithm.iteration();
epoch++;
double tmp = trainingAlgorithm.getError();
} while (tmp > trainingErrorThreshold);
double tmp2 = trainingAlgorithm.getError();
...
}
Как уже упоминалось, я должен создать новые объекты классификатора для каждого Callable, если я хочу, чтобы они обрабатывались независимо. В противном случае потоки будут изменять одни и те же элементы. –
Зависит от ваших объектов! Если вы можете сделать их потокобезопасными для своих нужд, тогда сделайте это, если не сможете, а затем скопируйте их. Мы не можем ответить на этот вопрос, если вы не сообщите нам больше о вашем случае использования. –