Vous êtes développeur J2ee vous aussi ? Débutant ?

Vos singletons ressemblent étrangement à ceci ?


 class Singleton
 {
   private static Singleton instance;
 
   private Singleton()
   {
     // .....
   }
 
   public static Singleton getInstance()
   {
     if (instance == null)  
       instance = new Singleton();
     return instance;
   }
 }

Vous n'avez peut être pas détecté les problématiques éventuels que peut poser cette solution lorsque l'application est fortement sollicitée ...
La méthode getInstance() étant statique, il est donc très fortement conseillé d'utilisé une synchronisation sur le "instance=new Singleton()" pour éviter les problèmes d'accès concurrents à la ressource.

Voici donc à quoi ce dont vous pensez :


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

Mais cette solution ne résout pas le problème, elle réduit juste fortement la probabilité que le problème se produise ...
Voici donc la solution proposée par IBM :


 class Singleton
 {
   private static Singleton instance = new Singleton();
 
   private Singleton()
   {
     //...
   }
 
   public static Singleton getInstance()
   {
     return instance;
   }
 }

Cette solution est vraiment tout bête, mais cela évite des pertes de performances sur les méthodes "getInstance()".

Pour plus d'explications, rendez-vous sur le site d'IBM.