Le design pattern Singleton (reloaded)

En savoir plus

1 : public class Singleton {
2 : private static _instance_;
3 :
4 :      private Singleton(){} 5 :
6 :      public static synchronized Singleton getInstance() {
7 :            if (_instance_ == null)                      //1
8 :                    _instance_ = new Singleton(); //2
9 :            return _instance_;                            //3
10 :       }
11 : }
 

Synchronisation de l'accès à la méthode 'getInstance()'.
Code © Edis Consulting

 

Pour éviter ce problème, nous allons modifier légèrement le code de la classe Singleton et en synchronisant l'accès à la méthode 'getInstance()' afin de s'assurer que deux threads ne peuvent pas y accéder simultanément (voir le code ci-contre).

Ce code fonctionne bien en environnement multithread. Toutefois la synchronisation de la méthode n'est nécessaire que lors du premier appel (quand '_instance_' est 'null'). Avec ce code tous les appels doivent payer le coût de la synchronisation.

Bien que les JVM soient de plus en plus performantes, ce coût peut poser des problèmes de performance lors de fortes montées en charge de l'application. L'exemple type est l'écriture dans un fichier d'événements, qui conduit inévitablement à une réduction drastique des performances de l'application.


JDN Développeur Envoyer Imprimer Haut de page