Quel est le but ou la valeur de la création d'une référence locale à une variable volatile statique qui est déjà conservée en tant que champ membre. Ce code provient de java.util.Scanner JDK 6b14 here.Variable locale utilisée pour accéder à la variable d'instance volatile
class Scanner {
private static volatile Pattern linePattern;
...
private static Pattern linePattern() {
Pattern lp = linePattern;
if (lp == null)
linePattern = lp = Pattern.compile("...");
return lp;
}
...
}
The Java Tutorials: « et les écritures sont Reads atomiques pour toutes les variables déclarées volatiles (y compris les variables long et double) ... toute écriture à une variable volatile établit un avant-arrive la relation avec les lectures suivantes de cette même variable. "
Cela signifie que la lecture de la référence à l'objet Motif n'échouera pas à mi-chemin car elle a été modifiée. Le mot clé volatile est censé protéger exactement ce type d'accès, donc la variable locale en double n'est pas destinée à garantir qu'une valeur valide est renvoyée.
En outre, l'initialisation paresseuse peut être fait sur le terrain membre sans avoir besoin d'un intermédiaire variable locale:
if (linePattern == null) linePattern = Pattern.compile("...");
Il semble être une optimisation du code octet comme on le voit here et here. L'utilisation de variables locales produit un bytecode plus petit (moins d'instructions) et moins d'accès à la valeur réelle (qui est une lecture volatile coûteuse). Cependant, ils n'ont pas utilisé l'optimisation de la variable finale avec elle, donc je suis sceptique à l'idée de tirer cette conclusion.
mais pourquoi ne pas initialiser paresseusement le champ de membre? – xst
La méthode encapsule exactement cela. Il est utilisé pour obtenir la valeur du champ et garantit qu'il est initialisé en cas de besoin. – Wormbo
'if (linePattern == null) linePattern = new ...' Ceci initialiserait paresseusement le champ membre au lieu de la variable locale. – xst