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 ?
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 :
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).