Ist iinc atomar in Java?

8

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?

    
StarPinkER 08.03.2013, 05:36
quelle

6 Antworten

17

Nein, es ist nicht

  • Abrufen des aktuellen Werts von c.
  • Erhöht den abgerufenen Wert um 1.
  • Speichern Sie den inkrementierten Wert in c.

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?

    
Narendra Pathai 08.03.2013, 05:38
quelle
6

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.

    
Evgeniy Dorofeev 08.03.2013 05:55
quelle
6

{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.

    
Clashsoft 15.05.2015 21:48
quelle
3

Nein, es ist nicht atomar, der Bytecode kann mit anderen Threads verschachtelt werden.

    
fguchelaar 08.03.2013 05:39
quelle
1

i ++ ist in Java nicht atomar.
Es ist besser,

zu verwenden %Vor%

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.

    
AmitG 08.03.2013 06:32
quelle
0

Es ist nicht atomar. Hier ist der generierte Byte-Code für ein Post-Inkrement eines statischen int:

%Vor%     
Ellen Spertus 27.09.2014 22:06
quelle

Tags und Links