2014-10-24 11 views
7

Czy istnieje sposób, aby wykonać operację "dekrementacji, jeśli wynik jest dodatni lub zerowy" z wartością AtomicInteger? Aby wyjaśnić pożądanego zachowania:AtomicInteger: zachowaj nieujemny

  • jeśli aktualna wartość jest większa od zera, zmniejszyć
  • jeżeli bieżąca wartość jest równa zero, nic nie robić
  • (ujemna wartość bieżąca nie jest obsługiwana)
+3

Nie widzę sposobu. Być może mógłbyś użyć 'java.util.concurrent.Semaphore'? Jest gwarantowane, że zawsze będzie dodatni, a możesz go zmniejszyć za pomocą 'acquire()' lub 'tryAcquire()'. – markspace

Odpowiedz

10

W Javie 8, yes:

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

Przed Java 8, no.

3

Przypuszczam, że można zrobić coś takiego wstępnego 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 

Nie jest to najbardziej elegancki kod, ale myślę, że to załatwia sprawę.

+0

Nie uważasz, że to zadziała, metoda będzie wymagać synchronicznego dostępu? –

+0

Nie, to rodzaj punktu AtomicInteger. – BarrySW19