Leistungsunterschied zwischen AtomicInteger und Integer

7

Gibt es einen Leistungsunterschied zwischen AtomicInteger und Integer ?

    
Boni 16.01.2012, 10:25
quelle

5 Antworten

13

Die Wahl dieser zwei Arten sollte nicht von der Leistung abhängen. Die Hauptauswahl für AtomicInteger ist, wenn Sie Thread-Sicherheit mit den Operationen für die ganze Zahl erreichen wollen.

Der Leistungsunterschied hängt jedoch stark vom gewählten Betriebssystem ab, da die detaillierte Implementierung von atomaren Operationen vom Betriebssystem abhängt.

    
tune2fs 16.01.2012, 10:30
quelle
5

Nun, wenn Sie es in einer Multithread-Umgebung verwenden, z. counter, dann musst du synchronize auf den Integer zugreifen

%Vor%

Obwohl Sie mit AtomicInteger ohne Synchronisation viel bessere Leistung erzielen können

%Vor%

Empfehlenswert Ссылка

BEARBEITEN Verwenden Sie incrementAndGet

    
bpgergo 16.01.2012 10:32
quelle
3

AtomicInteger ermöglicht einige (nicht alle!) Operationen, die ansonsten eine Synchronisation erfordern würden, unter Verwendung spezieller Hardware-Anweisungen auf eine lockfreie Weise auszuführen. Wie sich dies auf die Leistung auswirkt, ist etwas komplex:

  • Erstens ist es eine Mikrooptimierung, die nur von Bedeutung ist, wenn sich diese bestimmte Operation auf dem kritischen Pfad Ihrer Anwendung befindet.
  • Die speziellen Hardware-Anweisungen sind möglicherweise auf Nicht-Mainstream-Plattformen nicht verfügbar. In diesem Fall wird AtomicInteger wahrscheinlich mithilfe von Synchronisation implementiert.
  • Die JVM kann häufig den Sperr-Overhead optimieren, wenn keine Konkurrenz vorliegt (z. B. eine Anwendung mit einem einzelnen Thread). In diesem Fall gibt es wahrscheinlich keinen Unterschied.
  • Wenn es geringe bis moderate Sperrkonflikte gibt (d. h. mehrere Threads, aber meistens andere Dinge tun, als nur auf diese ganze Zahl zuzugreifen), ist der Lock-Free-Algorithmus besser als die Synchronisation.
  • Wenn es sehr starke Sperrenkonflikte gibt (dh viele Threads, die viel Zeit mit dem Zugriff auf diese Ganzzahl verbringen), kann die Synchronisation besser ausgeführt werden, da der lockfreie Algorithmus ständig versucht, die Operation erneut auszuführen eine Kollision.
Michael Borgwardt 16.01.2012 10:54
quelle
1

Außer dem sehr geringen Synchronisierungsaufwand, nein.

    
Bohemian 16.01.2012 10:29
quelle
0

Ich bin heute über diesen Beitrag gestolpert, wollte aber meine Ergebnisse teilen (Bitte keine Kommentare zum Code, da ich die folgenden Klassen manuell eingeben musste, da das System, in dem ich dieses ausführte, nicht mit dem Internet verbunden war:)

Unter dem Strich war die Ausgabe wie folgt:

ATOMIC-Ergebnisse: Elapsed = 25257 ms, ExpectedValue = 50000, FinalValue = 50000, true PrImItIvE Ergebnisse: Elapsed = 25257 ms, ExpectedValue = 50000, FinalValue = 48991, false

Für meine Verwendung in meiner speziellen App habe ich gewählt, Atomic-Werte für Statusnummern in einer Überwachungsklasse zu verwenden. Falls jemand andere harte Ergebnisse sehen wollte, habe ich mich dafür entschieden, diese Informationen zu posten.

Einen schönen Tag!

Klassen:

Ich habe eine Hauptklasse mit einer primitiven langen und einer atomaren Long- und Accessor-Inkrementmethode, einer IncrementAtomicRunnable und einer IncrementPrimitiveRunnable, erstellt.

LongOverhead:

%Vor%

IncrementAtomicRunnable:

%Vor%

und schließlich IncrementPrimitiveRunnable:

%Vor%     
JavaJd 28.06.2017 14:16
quelle

Tags und Links