De La tête d'abord design patterns book, le modèle singleton avec un verrouillage doublement vérifié a été implémenté comme ci-dessous :
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
Je ne comprends pas pourquoi volatile
est utilisé. N'est pas volatile
va à l'encontre de l'objectif de l'utilisation d'un verrouillage à double vérification, à savoir la performance ?
7 votes
Je pensais que le verrouillage à double vérification était cassé, quelqu'un l'a réparé ?
4 votes
Pour ce que ça vaut, j'ai trouvé que Head First design patterns était un livre horrible pour apprendre. En y repensant, il est parfaitement logique maintenant que j'ai appris les modèles ailleurs, mais pour apprendre sans connaître les modèles, il n'a vraiment pas servi son objectif. Mais il est très populaire, alors peut-être que c'était juste moi qui était dense :-)
0 votes
@DavidHeffernan J'ai vu cet exemple utilisé comme la seule façon de faire confiance à la jvm pour faire la DCL.
0 votes
Pour information, sur un système x86, un Read-Read volatile est censé aboutir à un no-op. En fait, la seule opération qui nécessite une clôture pour la cohérence de la mémoire est une écriture-lecture volatile. Donc, si vous n'écrivez vraiment la valeur qu'une seule fois, l'impact devrait être minime. Je n'ai jamais vu personne faire un test de référence à ce sujet et je pense que le résultat serait intéressant !
0 votes
@DavidHeffernan pour toutes les raisons pratiques, c'est toujours cassé. C'est mieux avec
volatile
(comme dans, "ne va pas bousiller votre programme"), mais alors vous ne gagnez pas vraiment beaucoup.0 votes
@TimBender Il est évident que nous n'avons un effet que pour l'écriture-lecture (si tout ce que nous faisons est de lire, il est plutôt inintéressant de savoir quelle copie identique nous lisons), mais "Only rarely results in an error" n'est pas très utile je pense - en fait, cela rend beaucoup plus difficile l'identification du problème.
0 votes
@Voo, je n'ai jamais dit "Il est rare qu'une erreur se produise", je voulais dire qu'en théorie, les performances ne devraient être affectées que peu de temps après l'initialisation.
0 votes
@TimBender Je vous ai mal compris - oui, je suis d'accord.
0 votes
Postes connexes aquí y aquí sur la raison pour laquelle une double vérification est nécessaire en premier lieu.
1 votes
Vérifiez ce lien pour savoir pourquoi
volatile
est utilisé en singleton : cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html