2009-12-18 5 views
0

J'ai un service Windows hébergeant plusieurs services WCF. Dans mon service Windows, j'ai deux objets avec un comportement singleton. Ces objets sont accessibles à travers les services WCF de l'extérieur. Un appel peut mettre une valeur dans les objets et un autre appel peut récupérer cette valeur.Objets partagés et problèmes de multithreading. Devrais-je m'en préoccuper?

Dois-je m'inquiéter des problèmes de multithreading? Je ne commence pas de discussion par moi-même. Mais de toute façon, devrais-je faire un verrouillage en accédant aux objets singleton? Qu'en est-il des méthodes d'accès aux objets? Ne devraient-ils pas être marqués comme synchronisés?

EDIT Ces objets ne sont pas des singletons. Les objets sont créés en utilisant IoC avec un comportement singleton.

Répondre

2

Chaque appel à vos services est un fil de sa propre. Donc, vous commencez des discussions, pas mal d'entre elles, même.

Je ne vais pas discuter de mon point de vue sur les singletons, etc. Mais, lorsque vous avez partagé des données mutables, avez pour réfléchir à la façon de le protéger des accès concurrents. Si le thread a met quelque chose dedans alors que le thread b cherche quelque chose, vous pouvez obtenir des résultats imprévisibles.

La solution la plus évidente serait d'utiliser un verrou pour la lecture et l'écriture. Découvrez les documents à ReaderWriterLockSlim qui devrait vous aider à démarrer.

+0

Un de mes amis m'a également indiqué une classe Semaphore dans System.Threading. Qu'est-ce que tu penses ? Il semble que cette classe contrôle uniquement l'accès à un pool de ressources. – user137348

+0

Si vous voulez commencer simple, vous pouvez tout aussi bien utiliser l'instruction "lock" de C#. Ce qui n'est rien de plus que du sucre syntaxique sur la classe Monitor. Cependant, assurez-vous de ne pas rendre visible l'instance que vous appelez verrouiller en dehors de votre classe singleton, afin d'éviter de vous déconnecter. –

1

Oui, je pense que vous devriez. Et quelque chose de très similaire a été demandé il n'y a pas si longtemps.

Object that is needed throughout the application

Voir cela pour quelques explications

Implementing Singleton in C#, regardant multithread Singleton.

également Ist way of implementing Singleton Pattern in C#: regardant façon IIIrd de mettre en œuvre un singleton en C#: simple multithread Singleton Motif et façon IVème de mettre en œuvre un singleton en C#: multithread Singleton Motif

+0

+1 Ne vous occupez pas des références utiles, simplement pour "Oui" –

+2

si le singleton estmutable, alors le simple fait de créer le code de threadplate du modèle singleton threadsafe ne va pas aider beaucoup. S'il fait des choses comme les suivantes (ce que je pense qu'il est), il doit s'assurer comment verrouiller ces reosurcesSingleton.Instance.AddSome (123, "some"); Singleton.Instance.GimmeSome (123); –

+0

Oui, c'est vrai. –

Questions connexes