2015-04-14 14 views
6

Come aggiornare un AtomicInteger se il suo valore attuale è inferiore al valore dato? L'idea è:Come aggiornare un atomico in base a una condizione?

AtomicInteger ai = new AtomicInteger(0); 
... 
ai.update(threadInt); // this call happens concurrently 
... 
// inside AtomicInteger atomic operation 
synchronized { 
    if (ai.currentvalue < threadInt) 
     ai.currentvalue = threadInt; 
} 
+0

pls incollare il codice di lavoro vale a dire senza alcun errore di compilazione .. – SMA

+0

vostro codice pubblicato lo snippet non ha senso Per prima cosa aggiorni 'ai' (qualunque cosa intendi con .update()) e dopo aver controllato il valore con quello nuovo. – SubOptimal

+1

Questa è una buona domanda e ha perfettamente senso. Per le critiche: è impossibile per l'OP scrivere codice di lavoro per questo. Se lo facesse, avrebbe bisogno di conoscere la risposta, quindi può pubblicare solo pseudo-codice. –

risposta

11

Se si utilizza Java 8 è possibile utilizzare uno dei nuovi metodi di aggiornamento in AtomicInteger, che è possibile passare un'espressione lambda. Per esempio:

AtomicInteger ai = new AtomicInteger(0); 

int threadInt = ... 

// Update ai atomically, but only if the current value is less than threadInt 
ai.updateAndGet(value -> value < threadInt ? threadInt : value); 
4

Se non si dispone di Java 8, è possibile utilizzare un CAS-loop in questo modo:

while (true) { 
    int currentValue = ai.get(); 
    if (newValue > currentValue) { 
     if (ai.compareAndSet(currentValue, newValue)) { 
      break; 
     } 
    } 
} 
Problemi correlati