AtomicInteger

AtomicInteger ist ein int-Wrapper aus java.util.concurrent.atomic, der thread-safe ist.

Verhindert Race-Conditions bei parallelen Lese-/Schreib-Zugriffen.

I. Wofür?


Mehrere Threads, die gleichzeitig count++ machen, geben nicht garantiert das korrekte Ergebnis (das ist KEIN atomarer Vorgang!). AtomicInteger löst das mit CPU-Instruktionen wie CAS (Compare-and-Swap).

II. Beispiel — @Singleton-Counter


@Singleton
public class CounterBean {
    private final AtomicInteger count = new AtomicInteger(0);

    public int incrementAndGet() {
        return count.incrementAndGet();   // atomar!
    }
}

III. Wichtige Methoden


Methode Wirkung
incrementAndGet() ++i (atomar)
getAndIncrement() i++ (atomar)
addAndGet(n) i += n (atomar)
get() aktuellen Wert lesen
compareAndSet(exp, new) CAS-Operation
Warning

Normales int count++ ist 3 Operationen (read, increment, write). Bei mehreren Threads geht etwas verloren.