Le design pattern Singleton (reloaded)

En savoir plus

Dans la description du design pattern Singleton, on oublie fréquemment les éventuels problèmes posés par l'appel à la méthode 'getInstance()' depuis plusieurs threads différents. Un problème se pose alors si deux threads accèdent simultanément à cette méthode et l'unicité de l'instance créée n'est alors lus garantie.

1. Thread1 appelle getInstance() et détermine que '_instance_' est 'null' en ligne 7,

2. Thread1 entre dans le bloc if puis est préempté par le Thread2 avant l'instanciation en ligne 8,

3. Thread2 appelle getInstance() et détermine que '_instance_' est 'null' en ligne 7,

4. Thread2 entre dans le bloc if, crée un nouveau Singleton et assigne ce nouvel objet à la variable '_instance_' en ligne 8,

5. Thread2 retourne la référence au Singleton en ligne 9,

6. Thread2 est préempté par le Thread1

7. Thread1 reprend où il s'était arrêté et créant alors une autre instance du Singleton en ligne 8,

8. Thread1 retourne cette nouvelle instance en ligne 9.

Nous voyons que nous avons obtenu deux instances de notre Singleton. Statistiquement, ce risque est faible, puisque cela peut se produire uniquement lors du premier appel du Singleton. Il s'agit ici du cas typique d'erreur, entraînant des plantages aléatoires difficilement reproductibles en débogage


JDN Développeur Envoyer Imprimer Haut de page