我有这个循环,启动工作线程,该减量当他们完成了一个的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,是的。我该怎么办? –