У меня есть класс Counter, который хранит значение как AtomicInteger. Этот класс должен быть потокобезопасным. У меня есть метод boolean consume(int number)
, который должен уменьшить счетчик и вернуть true
, если counter >= number
, и не должен менять счетчик и вернуть false
, если counter < 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();
}
, но javadoc accumulateAndGet
sais:
Функция должна быть без побочных эффектов, так как она может быть повторно применена при попыткеобновления не выполняются из-за конфликта между потоками.
Итак, мое решение имеет побочные эффекты. Это безопасно для использования? Если нет, как я могу получить тот же результат?