Le design pattern Singleton (reloaded)

En savoir plus

1 : Public class Singleton {
2 :
3 :      private class SingletonHolder {
4 :         private static _instance_= new Singleton();
5 :      }
6 :
7 :      private Singleton(){}
8 :
9 :      public static Singleton getInstance() {
10 :       return SingletonHolder._instance_;
11 :    }
12 : }
 

Un objet qui est instancié par la JVM dès le premier accès à la classe singleton.
Code © Edis Consulting

 

Finalement, après toutes ces tentatives, on s'interroge encore sur l'existence d'une implémentation suffisamment robuste pour venir à bout de cette problématique en enironnement multithread. En fait, ce dont nous avons besoin, c'est d'un objet qui est instancié par la JVM dès le premier accès à la classe singleton.

Ceci est réalisable par le biais de l'initialiseur 'static' et l'idiome 'Inialization on Demand Holder' qui requiert peu de code et pas de synchronisation. Cette approche fonctionne bien en multithread car la JVM garantit qu'un objet d'une classe ne peut être accédé tant que la clase n'est pas complètement chargée (voir ci-contre une implémentation utilisant cette technique).

Nous voyons bien que cette solution présente l'avantage, non négligeable, d'éliminer la synchronisation lors de chaque accès et les problèmes de performances induits. De plus aucune ressource n'est allouée tant qu'on n'accède pas à la classe. .


JDN Développeur Envoyer Imprimer Haut de page