我有一个启动工作线程的循环,当它们完成时会递减一个 AtomicInteger,并且当它达到 0 时我会检查是否启动任务。
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();
}
如果我应该,怎么做?使用同步块(synchronized block)?我应该同步什么?
最佳答案
AtomicInteger
的要点在于其中的每个函数都是原子,包括 decrementAndGet()
。
只有在使用 AtomicInteger
两次时才需要锁定,因为这样它可能会在两次调用之间发生变化。 (只有当你关心它是否改变时才需要锁定)
关于java - AtomicInteger 的 check-then-act 用法是否需要同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45718749/