Partage
  • Partager sur Facebook
  • Partager sur Twitter

Singleton pattern - thread safe

Sujet résolu
    19 janvier 2023 à 12:10:00

    Bonjour,

    l'implémentation suivante du pattern singleton est elle Thread-safe ?

    pucblic class MonSingleton {
    
      private static MonSingleton instance = new MonSingleton();
    
      private MonSingleton(){
      }
    
      public MonSingleton getInstance() {
        return instance;
      }
    
    }

    Je sais qu'il existe une meilleur implémentation mais avec un problème de performance.

    public synchronysed MonSingleton getInstance() {
     if(instance != null) {
      return instance;
     }
     
     instance = new Monsingleton();
     return instance;
     
    }






    -
    Edité par jeansimplicepat 19 janvier 2023 à 12:12:46

    • Partager sur Facebook
    • Partager sur Twitter
      19 janvier 2023 à 22:02:17

      Une proposition,

      Verrouillage doublement vérifié : Cette approche est une version thread-safe de l'approche d'initialisation paresseuse, elle utilise un mécanisme de verrouillage à double vérification pour garantir qu'une seule instance de la classe est créée.

      Elle ne synchronise que la première fois lorsque la classe est instanciée, et elle est également sûre.

      public class Singleton {
          private volatile static Singleton INSTANCE;
          private Singleton() {}
          public static Singleton getInstance() {
              if (INSTANCE == null) {
                  synchronized(Singleton.class) {
                      if (INSTANCE == null) {
                          INSTANCE = new Singleton();
                      }
                  }
              }
              return INSTANCE;
          }
      }
      


      un peu de lecture,

      https://stackoverflow.com/a/11165926

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        30 janvier 2023 à 13:17:39

        Merci pour ta suggestion.

        J'avais connaissance de cette solution mais sans que la variable d'instance soit "volatile". Par ailleurs dans le post de lecture que tu proposes ce n'est pas la plus optimisée en terme d'utilisation de ressource.

        Si on revient à ma préoccupation initiale qui était celle de savoir pourquoi la création de la variable d'instance à l'initialisation de la classe était thread safe , l'explication que j'ai trouvé est que c'est le classloader qui s'en charge (et pas un thread) de façon séquentiel. La leçon que j'en tire est que c'est la méthode de création d'un singleton avec le moins de overhead possible.

        A plus.

        -
        Edité par jeansimplicepat 30 janvier 2023 à 13:18:27

        • Partager sur Facebook
        • Partager sur Twitter

        Singleton pattern - thread safe

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown