2015-04-14 2 views
6

Wie wird ein AtomicInteger aktualisiert, wenn der aktuelle Wert kleiner als der angegebene Wert ist? Die Idee ist:Wie wird ein Atomic basierend auf einer Bedingung aktualisiert?

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 fügen Arbeits Code also ohne Kompilierungsfehler .. – SMA

+0

Ihr Code geschrieben Schnipsel machen keinen Sinn. Sie aktualisieren zuerst 'ai' (was auch immer Sie mit .update() meinen) und nachdem Sie den Wert mit dem neuen überprüft haben. – SubOptimal

+1

Das ist eine gute Frage und es macht Sinn. Für die Kritik: Es ist unmöglich für das OP, Arbeitscode dafür zu schreiben. Wenn es so wäre, müsste er die Antwort wissen, also kann er nur Pseudocode posten. –

Antwort

11

Wenn Sie mit Java 8 Sie eines der neuen Update-Methoden in AtomicInteger verwenden können, die Ihnen einen Lambda-Ausdruck passieren kann. Zum Beispiel:

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

Wenn Sie nicht Java 8 haben, können Sie eine CAS-Schleife wie folgt verwenden:

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