我有這個循環,啓動工作線程,該減量當他們完成了一個的AtomicInteger,我有一張支票在一項任務啓動時,得到0AtomicInteger的check-then-act的這種用法需要同步嗎?
private static AtomicInteger dataReadings;
void someMethod() {
dataReadings = new AtomicInteger(objects.size());
for (Object object: objects)
LongAction.perform(object).setResultCallback(new LongActionCallback<Object>() {
@Override
public void onResult(Object object) {
if (dataReadings.decrementAndGet() == 0) {
doSomething();
}
}
});
}
}
所以我的問題是,我應該同步以下部分代碼:
if (dataReadings.decrementAndGet() == 0) {
doSomething();
}
如果我應該怎麼做?使用同步塊?我應該同步什麼?
我們無法真正知道你要在這裏實現什麼,什麼對象是,哪些線程正在做什麼,等等。但如果對象是由幾個線程同時修改,你希望dataReadings總是變爲0時,所有對象已經被處理,那麼你的代碼就不是線程安全的。然而,同步你所問的代碼片段並不會使它更安全。 –
儘管(或者可能使其成爲本地變量),您需要同步「dataReadings」字段的賦值和讀取。 – yshavit
@JBNizet爲什麼它不是安全的?我希望dataReadings總是達到0,是的。我該怎麼辦? –