2012-02-15 2 views
0

Являются ли элементы объекта потокобезопасными, если я передаю один и тот же объект в разные 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(); 
... 
} 

ответ

0

Это зависит от того, как реализован ваш объект, очевидно, достаточно. Если вы ожидаете, что ваш объект будет доступен несколькими потоками, тогда вы должны выяснить, как сделать эти обращения потокобезопасными.

+0

Как уже упоминалось, я должен создать новые объекты классификатора для каждого Callable, если я хочу, чтобы они обрабатывались независимо. В противном случае потоки будут изменять одни и те же элементы. –

+0

Зависит от ваших объектов! Если вы можете сделать их потокобезопасными для своих нужд, тогда сделайте это, если не сможете, а затем скопируйте их. Мы не можем ответить на этот вопрос, если вы не сообщите нам больше о вашем случае использования. –

Смежные вопросы