Pas lors de l'instanciation, mais une fois que l'instanciation de l'objet Singleton est terminée, que se passera-t-il si deux threads ou plus essaient d'accéder au même objet Singleton? Surtout dans le cas où l'objet Singleton prend beaucoup de temps pour traiter la demande (disons 1 min) ... Dans ce cas, si pour ex., 5 threads tentent d'accéder au même objet singleton, quel sera le résultat? < / p>
Question supplémentaire: Normalement, quand devrions-nous aller pour le modèle singleton et quand devrions-nous l'éviter? P>
5 Réponses :
Un singleton n'est pas différent de tout autre objet autre que celui d'une seule instance. Que se passe-t-il lorsque vous essayez d'y accéder, cela dépendra en grande partie de ce que les threads d'accès tentent (c.-à-d. Lire vs écriture) et quel type de données tient votre singleton. p>
sauf si la synchronisation (verrouillage) n'est exécutée dans le singleton, la réponse est la suivante: c'est un free-pour-tous. P>
Bien que le singleton garantit qu'une seule instance d'un objet est utilisée à la demande, le motif lui-même ne fournit pas de manière intrinsèquement une forme de sécurité de fil. Ceci est laissé à la mise en œuvre. P>
Dans le cas spécifique, vous citerez (avec une méthode de course longue), il serait essentiel de synchroniser l'accès à n'importe quelle méthode utilisant des variables de niveau ou d'objet. Défaut de le faire, dans toute la probabilité, conduisait à des conditions de course. P>
bonne chance! p>
Bien, plus généralement, le singleton doit être threadsafe. Le verrouillage est une possibilité, mais l'apatridie est donc l'apatridie.
La réponse à votre question tel qu'il est, est "Cela dépend vraiment". Quel genre de singleton? C'est-à-dire qu'est-ce que ça fait et comment ça le fait? Et dans quelle langue? P>
La réalité est que le singleton patter) N ne dicte que et applique que vous ne pouvez avoir qu'une seule instance d'un certain objet. En particulier, cela ne dit rien sur plusieurs threads accédant à cet objet. P>
Donc, si codé droit (avec une synchronisation de fil de fil mises en œuvre correctement) il n'y a aucune raison pour laquelle il ne devrait pas se comporter correctement - même si les demandes à l'objet prennent très longtemps à traiter! P>
La règle générale que j'utilise pour les singletons est que cela ne devrait pas affecter le code d'exécution et ne pas avoir d'effets secondaires. Essentiellement pour moi, dans mes projets, cela se traduit par une sorte de fonctionnalité de journalisation ou de la recherche de valeur statique (c.-à-d. Chargement de données communes d'une base de données une fois et la stocker à titre de référence afin que cela ne soit pas à lire à chaque fois que c'est nécessaire) . P>
Ensuite, vous avez besoin d'une mise en oeuvre en toute sécurité du motif singleton. p>
Trouver Cet article utile pour la même chose qui décrit la plupart des multi-threading Scénario de modèle singleton. P>
hth! p>
Notez que les réponses seulement des liaisons sont découragées, les réponses doivent donc être le point final d'une recherche d'une solution (contre une autre halte de références, qui tendent à être obsolète au fil du temps). Veuillez envisager d'ajouter un synopsis autonome ici, en gardant le lien comme référence.
La réponse à votre question tel qu'il est, est "Cela dépend vraiment". Quel genre de singleton? C'est-à-dire qu'est-ce que ça fait et comment ça le fait? Et dans quelle langue?