java - Volatil peut-il résoudre le problème de la sécurité des données partagées par thread?
欧阳克
欧阳克 2017-06-23 09:14:04
0
2
984

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 ?

欧阳克
欧阳克

温故而知新,可以为师矣。 博客:www.ouyangke.com

répondre à tous(2)
女神的闺蜜爱上我

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;
}
代言

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal