我有一个将值存储为 AtomicInteger 的 Counter 类。该类应该是线程安全的。我有方法boolean consume(int number)
应该递减计数器并返回true
if counter >= number
,并且不应该更改计数器并返回false
ifcounter < number
class Counter {
AtomicInteger counter = new AtomicInteger(initialValue);
boolean consume(int number) {
counter.accumulateAndGet(number, (prev, next) -> {
if (number <= prev) {
return prev - number;
} else {
// not modify the previous number;
return prev;
}
});
return ???
}
}
而且我不知道该功能是否适用。我找到了以下解决方案
boolean consume(int number) {
AtomicBoolean result = new AtomicBoolean(false);
counter.accumulateAndGet(number, (prev, next) -> {
if (number <= prev) {
result.set(true);
return prev - number;
// function applied
} else {
result.set(false);
// not modify the previous number;
return prev;
}
});
return result.get();
}
accumulateAndGet
但是sais的javadoc :
该函数应该没有副作用,因为当尝试更新由于线程之间的争用而失败时,它可能会被重新应用。
所以,我的解决方案有副作用。使用安全吗?如果没有,我怎样才能得到相同的结果?