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.

1. Le , 22:10 par tellaw
d41d8cd98f00b204e9800998ecf8427e

Excellente solution, je l'ai aussi adopter, car c'est simple, rapide et lisible....

2. Le , 22:38 par Ludovic
d41d8cd98f00b204e9800998ecf8427e

C'est clair, ça évite les double synchronized ...

Le classloader charge toutes les classes séquentiellement, ce qui évite les problèmes d'accès concurrents lors de l'initialisation de l'instance.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.