2012-02-15 92 views
0

如果我将同一个对象传递给不同的Callables,然后传递给ExecutorService,则对象的成员是线程安全的吗?在我的例子中,分类器具有属性训练数据,测试数据和网络。所有通过调用分类器的方法在Callable的call()方法中使用。同一个分类器对象被传递给每个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创建新的分类器对象,如果我想让它们独立处理。否则,线程将修改相同的对象成员。 – 2012-02-15 07:07:12

+0

取决于你的物体!如果你可以让它们适合你的需求,那么就做到这一点,如果你不能,然后复制它们。我们无法真正回答这个问题,除非您更多地告诉我们您的使用案例。 – 2012-02-15 15:36:02

相关问题