39 votes

Comment résoudre la Déclaration "Double-Checked Locking is Broken" en Java ?

Je veux implémenter l'initialisation paresseuse pour le multithreading en Java.
J'ai un code du genre :

class Foo {
    private Helper helper = null;
    public Helper getHelper() {
        if (helper == null) {
            Helper h;
            synchronized(this) {
                h = helper;
                if (h == null) 
                    synchronized (this) {
                        h = new Helper();
                    } // release inner synchronization lock
                helper = h;
            } 
        }    
        return helper;
    }
    // other functions and members...
}

Et je reçois la déclaration "Double-Checked Locking is Broken".
Comment puis-je résoudre ce problème ?

13voto

erickson Points 127945

Voici un modèle pour un verrouillage correct à double contrôle.

class Foo {

  private volatile HeavyWeight lazy;

  HeavyWeight getLazy() {
    HeavyWeight tmp = lazy; /* Minimize slow accesses to `volatile` member. */
    if (tmp == null) {
      synchronized (this) {
        tmp = lazy;
        if (tmp == null) 
          lazy = tmp = createHeavyWeightObject();
      }
    }
    return tmp;
  }

}

Pour un singleton, il existe un idiome beaucoup plus lisible pour l'initialisation paresseuse.

class Singleton {
  private static class Ref {
    static final Singleton instance = new Singleton();
  }
  public static Singleton get() {
    return Ref.instance;
  }
}

2voto

jutky Points 1464

Définir la variable qui doit être vérifiée deux fois avec volatile midifier

Vous n'avez pas besoin de la variable h. Voici un exemple d'ici

class Foo {
    private volatile Helper helper = null;
    public Helper getHelper() {
        if (helper == null) {
            synchronized(this) {
                if (helper == null)
                    helper = new Helper();
            }
        }
        return helper;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X