60 votes

Comment implémenter l'initialisation paresseuse thread-safe ?

Quelles sont les approches recommandées pour obtenir une initialisation paresseuse thread-safe ? Par exemple,

 // Not thread-safe
public Foo getInstance(){
    if(INSTANCE == null){
        INSTANCE = new Foo();
    }

    return INSTANCE;
}

9voto

JB Nizet Points 250258

Le moyen le plus simple est d'utiliser une classe titulaire interne statique :

 public class Singleton {

    private Singleton() {
    }

    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }

    private static class Holder {
        private static final Singleton INSTANCE = new Singleton();
    }
}

6voto

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

C'est ce qu'on appelle une double vérification ! Vérifiez ceci http://jeremymanson.blogspot.com/2008/05/double-checked-locking.html

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