2014-10-24 6 views
7

Есть ли способ выполнить операцию «декремент, если результат положительный или нулевой» с AtomicInteger? Чтобы уточнить желаемое поведение:AtomicInteger: сохранить неотрицательный

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

Я не вижу пути. Возможно, вы могли бы использовать 'java.util.concurrent.Semaphore'? Это всегда будет положительным, и вы можете уменьшить его с помощью 'приобретать()' или 'tryAcquire()'. – markspace

ответ

10

В Java 8, yes:

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

Перед Java 8, no.

3

Я полагаю, вы могли бы сделать что-то вроде этого предварительного 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 

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

+0

Не думаете ли вы, что для этого нужен метод синхронного доступа? –

+0

Нет, это своего рода точка AtomicInteger. – BarrySW19