2010-11-25 5 views
1

J'ai toujours eu ce scénario spécifique m'inquiète pour des éons. Disons que ma classe ressemble à cecisont des propriétés de classe ou des variables thread sûr

public class Person { 
public Address Address{get;set;} 
public string someMethod() 
{} 
} 

Ma question est, on m'a dit par mes collègues développeurs que le propery Adresse de type Adresse, est pas thread-safe.

Du point de vue de la demande Web, chaque requête est exécutée sur un thread séparé et chaque fois le fil traite la ligne suivante dans mon objet métier ou code derrière, par exemple

var p = new Person(); 

il crée une nouvelle instance de Objet Personne sur le tas et donc l'instance est accédée par le thread demandeur, à moins que et je ne génère d'autres threads dans mon application.

Si je me trompe, s'il vous plaît expliquez-moi pourquoi je me trompe et pourquoi la propriété publique (adresse) n'est pas thread thread?

Toute aide sera grandement appréciée.

Merci.

Répondre

2

Si la référence à votre instance Person est partagée entre plusieurs threads, plusieurs threads peuvent potentiellement changer Address provoquant une condition de concurrence. Cependant, à moins que vous ne conserviez cette référence dans un champ statique ou dans Session (une sorte d'endroit globalement accessible) alors vous n'avez rien à craindre. Si vous créez des références à des objets dans votre code comme vous l'avez montré ci-dessus (var p = new Person();), alors vous êtes parfaitement sûr car les autres threads ne pourront pas accéder à la référence à ces objets sans recourir à des astuces méchantes et malveillantes.

+0

"à moins que vous ne conserviez cette référence dans un champ statique ou dans une session" en effet, ou que vous transmettiez la même instance de l'objet aux threads de travail. –

+0

Merci à vous tous, cela a vraiment beaucoup de sens maintenant. –

1

Votre propriété n'est pas thread-safe, car vous n'avez aucun verrouillage pour empêcher plusieurs écritures à la propriété de marcher sur chacun des autres orteils.

Cependant, dans votre scénario où vous ne partagez pas une instance de votre classe entre plusieurs threads, la propriété n'a pas besoin d'être thread-safe.

Objets qui sont partagés entre plusieurs threads, où chaque thread peut changer l'état de l'objet, alors tous les changements d'état doivent être protégés afin qu'un seul thread à la fois puisse modifier l'objet.

0

Vous devriez être bien avec cela, mais il y a quelques choses que je vous soucier de ...

Si votre objet personne devait être modifié ou tenu des ressources disponibles, vous pourriez potentiellement constater que l'un des les threads seront incapables de lire cette variable. Pour éviter cela, vous devrez verrouiller l'objet avant de le lire/écrire pour vous assurer qu'il ne sera pas piétiné par d'autres threads. Le plus simple est d'utiliser la construction lock {}.

+0

Merci à vous tous, ça a vraiment beaucoup de sens maintenant. –

Questions connexes