AtomicInteger: держите неотрицательным

есть ли способ выполнить операцию" уменьшение, если результат положительный или нулевой " с помощью AtomicInteger? Чтобы уточнить желаемое поведение:

  • если текущее значение больше нуля, уменьшите
  • если текущее значение равно нулю, ничего не делать
  • (отрицательное текущее значение не обрабатывается)

2 ответов


В Java 8, да:

atomicInteger.updateAndGet(i -> i > 0 ? i - 1 : i); 

Перед Java 8,нет.


Я полагаю, вы могли бы сделать что-то вроде этого pre-Java 8:

int val = atomicInt.get();
boolean success = false;
while(val > 0 && !success) {
    success = atomicInt.compareAndSet(val, val - 1);
    if(!success) {
        // Try again if the value is still > 0
        val = atomicInt.get();
    }
}
// Check 'success' to see if it worked

Не самый элегантный код, но я думаю, что он делает трюк.