Ich weiß, dass die Inkrementierungsoperation in C ++ ohne Sperre nicht atomar ist.
Wird JVM eine Sperre für die Implementierung der iinc
-Anweisung hinzufügen?
Nein, es ist nicht
Java-Dokumentation für Atom- und Thread-Interferenz
Sie müssen entweder synchronized
keyword verwenden oder AtomicXXX
methods für die Thread-Sicherheit verwenden.
AKTUALISIEREN :
%Vor%oder
%Vor%Lesen Sie auch: Ist iinc Atom in Java?
Nicht, dass es nicht und es kann echte Probleme verursachen. Dieser Test soll 200000000 drucken, aber es liegt nicht an Thread-Interferenz
%Vor% Beachten Sie, dass volatile
das Problem nicht löst.
{Obwohl es bereits eine akzeptierte Antwort gibt, wollte ich etwas aufklären, also die späte und technisch unnötige Antwort}
Die Antwort auf Ihre Frage hängt davon ab, ob Sie die Anweisung IINC
oder, was andere Antworten betreffen, den Operator ++
meinen.
Die Verwendung von ++
in einem statischen oder Instanzfeld ist nichts anderes als get, increment und set, also ist es nicht atomar (die anderen Antworten erklären das genauer).
Aber
Da Sie gefragt haben, ob der IINC
Befehl atomar ist, ist dies nicht die richtige Antwort. Tatsächlich adressiert keine der Antworten auf diese Frage die -Anweisung , alle scheinen auf dem Operator zu basieren, der in Instanz- oder statischen Feldern verwendet wird.
Der IINC
Befehl only arbeitet mit lokalen Variablen. Wie der Name schon sagt, sind sie nur lokal und nur in sehr begrenztem Umfang zugänglich. Daher ist es nicht möglich, von einem anderen Thread auf eine lokale Variable zuzugreifen. Das bedeutet, dass es egal ist, ob der Befehl atomar ist oder nicht.
Nein, es ist nicht atomar, der Bytecode kann mit anderen Threads verschachtelt werden.
i ++ ist in Java nicht atomar.
Es ist besser,
Es gibt Methoden wie
definiert %Vor%Jede Operation mit der obigen Methode wäre atomar.
Diese Klasse steht unter java.util.concurrent.atomic
package.
Java 1.5
hat viele Funktionen für Sicherheit und Parallelität von Threads hinzugefügt.
Es ist nicht atomar. Hier ist der generierte Byte-Code für ein Post-Inkrement eines statischen int:
%Vor%