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.
Nun, wenn Sie es in einer Multithread-Umgebung verwenden, z. counter, dann musst du synchronize
auf den Integer zugreifen
Obwohl Sie mit AtomicInteger ohne Synchronisation viel bessere Leistung erzielen können
%Vor%Empfehlenswert Ссылка
BEARBEITEN Verwenden Sie incrementAndGet
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:
AtomicInteger
wahrscheinlich mithilfe von Synchronisation implementiert. 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%Tags und Links java concurrency