ForkJoinPool
fait un usage intensif de compareAndSwap...
de sun.misc.Unsafe
et la plupart des occurrences de do {} while (...)
en ForkJoinPool
peut - comme mentionné par d'autres réponses - être expliqué par ce commentaire sous la rubrique Notes de style :
* There are several occurrences of the unusual "do {} while
* (!cas...)" which is the simplest way to force an update of a
* CAS'ed variable.
Le choix d'utiliser l'écriture d'un while
-boucle avec un corps vide comme do {} while (condition)
semble toutefois être un choix essentiellement stylistique. Ceci est peut-être plus clair dans HashMap
qui a été mis à jour dans Java 8.
Dans la version de Java 7 HashMap
vous pouvez trouver ceci :
while (index < t.length && (next = t[index++]) == null)
;
Bien qu'une grande partie du code qui l'entoure ait également changé, il est clair que le remplacement dans Java 8 est le suivant :
do {} while (index < t.length && (next = t[index++]) == null);
La première version présente la faiblesse suivante : si le seul point-virgule était supprimé, la signification du programme serait modifiée en fonction de la ligne suivante.
Comme on le voit ci-dessous, le bytecode généré par while (...) {}
y do {} while (...);
est légèrement différent, mais pas d'une manière qui devrait affecter quoi que ce soit lors de l'exécution.
Code Java :
class WhileTest {
boolean condition;
void waitWhile() {
while(!condition);
}
void waitDoWhile() {
do {} while(!condition);
}
}
Code généré :
class WhileTest {
boolean condition;
WhileTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
void waitWhile();
Code:
0: aload_0
1: getfield #2 // Field condition:Z
4: ifne 10
7: goto 0
10: return
void waitDoWhile();
Code:
0: aload_0
1: getfield #2 // Field condition:Z
4: ifeq 0
7: return
}