Maison > Questions et réponses > le corps du texte
Par exemple, si je veux écrire un modèle singleton, je n'utiliserai pas la méthode de synchronisation sycrynisée, mais j'utiliserai la modification volatile
Sigleton privé(){
}
Sigleton volatile statique privé s = null;
public statique Sigleton getInstance(){
if (s==null){
s= new Singleton();
}
return s;
}
Cela peut-il résoudre le problème de sécurité des fils ?
Comment comprendre la visibilité des fils de discussion
Si j'ai deux threads entrant en même temps si s==null, deux nouveaux objets sigleton ne seront-ils pas créés à la fin ?
女神的闺蜜爱上我2017-06-23 09:16:04
Si les frais généraux de new sont très faibles, vous pouvez tout à fait écrire comme ça. Mais si la surcharge d'initialisation est élevée, vous devez toujours utiliser synchronisé. Un serrure à double vérification typique s'écrit comme ceci :
private Singleton() {}
private static volitile Singleton s = null;
public static Singleton getInstance() {
if (s == null) {
synchronized (Singleton.class) {
if (s == null) {
s = new Singleton();
}
}
}
return s;
}
代言2017-06-23 09:16:04
Comment comprendre la visibilité des fils de discussion
Comprenez d'abord le modèle de mémoire.
Le thread ne modifie pas directement les variables dans la mémoire principale, mais écrit d'abord sa propre mémoire de travail, puis la synchronise avec la mémoire principale. S'il n'a pas été synchronisé, les autres threads ne verront pas la modification (ils verront toujours leur. propre cache de mémoire de travail).