Der folgende Code funktioniert ohne Race-BedingungWarum ist es möglich, atomare Variablen gleichzeitig ohne Racebedingung in Java zu aktualisieren?
AtomicInteger atomicInt = new AtomicInteger(0);
ExecutorService executor = Executors.newFixedThreadPool(20);
IntStream.range(0, 1000)
.forEach(i -> executor.submit(atomicInt::incrementAndGet));
Hier ist die Implementierung von incrementAndGet
ist
public final int incrementAndGet() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}
Wir sehen current
nicht synchronisiert oder verriegelt ist, nachdem ein Thread die current
ein anderer Thread aktualisieren könnte bereits erhalten die current
.
Aber es scheint wie atomare Klasse Race Condition einige vermeidet.
Kann jemand auf meinen Fehler hinweisen?
'compareAndSet()' verwendet Sperren. In den meisten Implementierungen wird 'compareAndSet()' eine spezielle Anweisung ausführen, die das Sperren in Hardware durchführt (z. B. die CMPXCHG-Anweisung auf x86-Hardware.) Https://en.wikipedia.org/wiki/Compare-and-swap –