Question

Dans notre couche d'accès aux données au travail, nous avons cette implémentation standard dans laquelle la classe est accessible via une propriété publique singleton qui ressemble à ceci:

public static CustomerController Instance
        {
            get 
            {
                lock(singletonLock)
                {
                    if( _instance == null )
                    {
                        _instance = new CustomerController();  
                    }
                    return _instance;
                }
            }
        }

maintenant, je comprends ce que fait le code, mais je me demandais pourquoi vous le feriez plutôt que de créer une instance de la classe chaque fois qu'elle est utilisée?

Était-ce utile?

La solution

EDIT: Oh whoops, je n'ai pas saisi les "couches d'accès aux données". partie. Mais j’en ai aussi un exemple: si votre application multithread transfère tous ses appels de base de données via une classe singleton, un seul thread accédera à la base de données à la fois, évitant ainsi les situations de concurrence critique.

Si vous utilisez un mécanisme de journalisation dans une application multithread que vous utilisez pour cracher toutes les exceptions et simplement écrire des informations (en particulier pour les services ou les applications en cours d'exécution, l'affichage des statuts chaque fois que des problèmes surviennent), vous devrez: rencontrer des problèmes de verrouillage de fichier. J'utilise une classe de consignateur singleton, de sorte qu'un seul thread ait jamais accès au consignateur et que les autres attendent jusqu'à ce qu'il soit libre d'écrire leur ligne dans le fichier texte.

Il existe de nombreuses bonnes raisons d’utiliser un singleton, mais j’étais comme vous et je ne savais pas ce qu’ils étaient POUR J’ai rencontré ce problème d’accès aux fichiers dans une application multithread.

Autres conseils

Vous voudrez peut-être aussi le faire, son verrouillage vérifié, cela accélérera l'accès à votre singleton

 public static CustomerController Instance
        {
                get 
                {
                        if( _instance == null )
                        {
                           lock(singletonLock)
                           {
                                if( _instance == null )
                                {
                                        _instance = new CustomerController();  
                                }

                            }
                        }   
                        return _instance;
                }
        }

La réponse est assez simple: vous voulez obtenir le même objet à chaque utilisation.

Cela vous donne les avantages d'être une variable globale (c'est-à-dire qu'il n'y en a qu'une) avec les avantages d'être un objet de classe (entre autres choses, cela permet d'effectuer une initialisation non visible dès la première utilisation).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top