2014-10-24 13 views
7

Esiste un modo per eseguire un "decremento se il risultato è positivo o zero" con un AtomicInteger? Per chiarire il comportamento desiderato:AtomicInteger: keep not-negative

  • se il valore corrente è maggiore di zero, decrementare
  • se il valore corrente è uguale a zero, non fare nulla
  • (valore corrente negativa non è gestita)
+3

Non vedo un modo. Forse potresti usare 'java.util.concurrent.Semaphore'? È garantito che sia sempre positivo, e puoi decrementarlo con 'acquire()' o 'tryAcquire()'. – markspace

risposta

10

In Java 8, yes:

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

Prima di Java 8, no.

3

Immagino che si potrebbe fare qualcosa di simile 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 

non il codice più elegante, ma penso che fa il trucco.

+0

Non pensi che funzioni per far sì che il metodo abbia bisogno di un accesso sincronizzato? –

+0

No, questo è il punto di un AtomicInteger. – BarrySW19