Behandelt AtomicInteger die Synchronisation?

Aug 17 2020

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

3 Joni Aug 17 2020 at 12:04

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.