Behandelt AtomicInteger die Synchronisation?
int iWenn zwei Threads beide mit i++ inkrementieren , könnten wir ein Problem bekommen, da i++ keine atomare Operation ist. Deshalb gibt es AtomicInteger.increment(), was das Inkrementieren atomar macht. Wenn wir also 1 Kern und 2 Threads .increment()hätten, könnte es absolut kein Problem geben (da es nicht mitten im Betrieb angehalten werden kann).
Aber was wäre, wenn wir 2 Kerne und 2 Threads hätten und sie parallel (genau zur gleichen Zeit) das nennen increment()?
Könnte es die Möglichkeit geben, dass sie den gleichen Wert von laden int i? Das heißt, wenn 1int i wäre, wäre das Endergebnis 2 und nicht 3 . In diesem Fall ist es uns egal, ob es sich um eine atomare Operation handelt, da beide gleichzeitig den gleichen Wert angenommen haben.
Fazit: Wird die Synchronisation von AtomicInteger gehandhabt?
Antworten
Könnte es die Möglichkeit geben, dass sie den gleichen Wert von laden
int i?
Ja, das gibt es, aber es wird für Sie erledigt.
Die incrementAndGetMethode verwendet eine atomare "Compare and Set"-Operation, die den inkrementierten Wert setzt, aber nur, wenn noch kein neuer Wert gesetzt wurde . Wenn der Vergleich fehlschlägt, incrementAndGetruft den neuen Wert ab und versucht es erneut.
Der Nettoeffekt ist, dass es sicher incrementAndGetvon mehreren Threads aus verwendet werden kann.