Während vs. do-while
while und do-while sind funktional äquivalent wenn die Blöcke leer sind , obwohl es zwar natürlicher erscheint:
%Vor% Ein typischer Anwendungsfall von while / do-while mit einem leeren Block besteht darin, eine Aktualisierung von atomaren Objekten mit einem compareAndSet (CAS) zu erzwingen. Zum Beispiel erhöht der folgende Code a
auf thread-sichere Weise:
Kontext
Mehrere Teile von java.util.concurrent verwenden das do {} while (...)
idiom für CAS-Operationen und das Javadoc von ForkJoinPool
erklärt:
Es gibt mehrere Vorkommen des ungewöhnlichen
do {} while (!cas...)
, was die einfachste Möglichkeit ist, eine Aktualisierung einer CAS-Variablen zu erzwingen.
Da sie zugeben, dass es ungewöhnlich ist, nehme ich an, dass sie am besten und nicht am einfachsten bedeuten.
Frage
Gibt es Situationen, in denen do {} while (!cas)
effizienter sein kann als while (!cas) {}
und aus welchen Gründen?
Also bedeutet "do while", dass der Code einmal in der while-Schleife ausgeführt wird. Dann wird der Code nur innerhalb der while-Schleife ausgeführt, wenn die Bedingung wahr ist.
Einfache Demonstration
%Vor%Ausgabe "dieser Text angezeigt"
Normal
%Vor%Ausgabe ""
Warum oder wo du es tun würdest, während ich nicht über die Notwendigkeit gekommen bin, damit ich dir nicht helfen kann. Es geht nur darum, ein Problem / eine Notwendigkeit zu identifizieren und das zu nutzen, was Sie wissen, um es zu lösen. Ähnlich wie Lego - die mechanische Art nicht "blockiert".
Dies ist keine Frage der Effizienz. Einige Fälle können nur ohne do {} while () gelöst werden. Schauen Sie sich java.util.Random.next (int Bits) an. Wenn Sie versuchen, dasselbe mit while () {} zu tun, würden Sie ein Code-Duplikat haben, weil der cycle body einmal vor der Bedingung ausgeführt werden muss.
Ich habe bereits eine sehr ähnliche Frage gestellt: Loops in Java kompilieren .
Dieser Code:
%Vor%ist zusammengestellt in:
%Vor%Möglicherweise bemerken Sie zusätzliche Anweisungen in Zeile 13 in method1 (). Aber wie durch die Antwort in meiner Frage vorgeschlagen wurde, hat dies keinen Unterschied, wenn es von JIT in Maschinenanweisungen kompiliert wird. Sehr schwer erreichbare Leistungsverbesserung. Um dies zu beweisen, müssen Sie mit dem PrintAssembly-Schlüssel arbeiten. Theoretisch ist Methode 2 schneller, aber in der Praxis sollten sie gleich sein.
Tags und Links java performance while-loop do-while compare-and-swap