2012-02-15 94 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

相關問題