Maison  >  Questions et réponses  >  le corps du texte

java - Volatil peut-il résoudre le problème de la sécurité des données partagées par thread?

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 ?

欧阳克欧阳克2674 Il y a quelques jours941

répondre à tous(2)je répondrai

  • 女神的闺蜜爱上我

    女神的闺蜜爱上我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;
    }

    répondre
    0
  • 代言

    代言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).

    répondre
    0
  • Annulerrépondre