AtomicInteger
AtomicInteger ist ein
int-Wrapper ausjava.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.