12
votes

Différence entre le verrouillage (ceci) et une serrure d'objet statique

Lequel des deux extraits de code suivants est préférable d'utiliser? XXX PRE>

ou P>

lock (this)


0 commentaires

3 Réponses :


8
votes

Il est presque toujours préférable de verrouiller sur un objet libéonny privé.

La différence est que ceci est généralement visible au code extérieur, ce qui peut prendre une serrure dessus, c'est-à-dire - P >

var obj = new YourClass();
lock(obj)
{
    ...
}


0 commentaires

2
votes

Parce que vous ne voulez pas que le verrou soit accessible de l'extérieur de l'objet.

Si vous utilisez un verrou (ceci), vous pouvez obtenir une impasse: p>

void blah() {
   lock(this);
   sleep(200);
}

//Some other block of code

MyObject a;
foreach(Mythread m in threads)
{
   lock(a);
   m.Call(a.blah); //Not the best syntax, but you get the idea.
}


0 commentaires

22
votes

Il pourrait y avoir une grande différence. La différence la plus importante entre les deux est que le premier exemple utilise un seul objet pour verrouiller (d'où le mot-clé statique ) tandis que le mot-clé dans le deuxième exemple implique de verrouiller sur un exemple. Il pourrait donc y avoir une grande différence dans une perspective de performance et même du point de vue de l'exactitude, mais cela dépend du code à l'intérieur de la serrure.

Une fois que tout ce dont vous avez besoin est de synchroniser l'accès aux champs de niveau d'instance, vous ne devez pas utiliser le mot-clé statique , car cela synchronisera le code lui-même, au lieu des données (pouvant entraîner une performance inutile. frapper). Bien sûr, si les données elles-mêmes sont statiques (données de niveau de classe au lieu de données de niveau d'instance), vous devez utiliser le mot-clé statique . D'autre part, lorsque vous utilisez le mot-clé de ce à verrouillage, lorsque vous accédez à des ressources partagées / statiques, vous aurez (bien sûr) avoir un problème d'exactitude, car la synchronisation est sur une base d'instance et Une instance multiple sera toujours en mesure d'accéder aux données partagées en même temps.

Et il y a un autre problème, mais la différence est beaucoup plus petite que pour les différences précédemment notées. Le premier exemple utilise un objet déclaré privé à verrouiller, tandis que l'autre utilise le pointeur CE , qui est la référence à l'objet de cette méthode d'instance elle-même. Étant donné que cette référence est accessible au public avec d'autres objets, il leur est possible de les verrouiller, ce qui pourrait provoquer des blocages dans de rares circonstances. Si vous êtes un développeur d'applications, je ne m'inquiéterais pas beaucoup à ce sujet (tant que vous ne verrouillez pas sur des choses comme system.string ou system.type ), mais si vous êtes un développeur-cadre, vous ne devez certainement pas utiliser verrouillage (ceci) , car il n'y a aucun moyen de dire en quoi les développeurs d'applications (AB) utilisent votre code.


1 commentaires

Steven, concernant "... Synchronisera le code lui-même, au lieu des données (ce qui pourrait entraîner une performance inutile)" - pouvez-vous s'il vous plaît élaborer pourquoi ce serait une performance frappée? Tia