La différence entre le manuel de verrouillage et de méthodes Synchronisées
Quelle est la différence entre ceci:
internal class MyClass
{
private readonly object _syncRoot = new Object();
public void DoSomething()
{
lock(_syncRoot)
{
...
}
}
public void DoSomethingElse()
{
lock(_syncRoot)
{
...
}
}
}
et ce:
internal class MyClass
{
[MethodImpl(MethodImplOptions.Synchronized)]
public void DoSomething()
{
...
}
[MethodImpl(MethodImplOptions.Synchronized)]
public void DoSomethingElse()
{
...
}
}
La seule différence que je vois, c'est que la première approche des verrous sur certains député alors que la deuxième approche serrures sur l'instance elle-même (donc il doit verrouiller tout le reste dans l'instance). Est-il des conseils généraux de l'approche à utiliser? J'ai actuellement deux classes ayant un objet similaire dans notre projet, chacun écrit avec une approche différente.
Edit:
Peut-être une question de plus. Est-ce:
internal class MyClass
{
[MethodImpl(MethodImplOptions.Synchronized)]
public void DoSomething()
{
...
}
}
exactement les mêmes comme ceci:
internal class MyClass
{
public void DoSomething()
{
lock(this)
{
...
}
}
}
- découvrez stackoverflow.com/questions/541194/...
- Grand. Ma question est presque le double.
- Je voudrais afficher l'attribut de la forme polie "suggestion" pour le compilateur. Je ne suis pas sûr si elles sont liées par la norme à suivre. Alors que explicitement à l'aide d'un
lock
déclaration applique une compilation exigence. - Une suggestion polie n'est pas très utilisable/fiable, serait-il?
- Je dis simplement que je ne me souviens pas qu'il soit verrouillé par une norme en tant que "doit être mise en œuvre" par la conformité de la CLR.
Vous devez vous connecter pour publier un commentaire.
La première méthode est préférable car vous pouvez (et devez) faire
_syncRoot
privé. Cela réduit le risque d'interblocage.La
MethodImplOptions.Synchronized
est un reste à partir d'une idée ambitieuse qui s'est avéré être pas si bon, après tout.Concernant la dernière question: Oui, selon ce blog ils sont fonctionnellement équivalents (mais pas mis en œuvre la même façon). Et de toutes les formes de
lock(this)
sont découragés, à nouveau en raison de scénarios de blocage.private
méthodes?découvrez http://blogs.msdn.com/b/bclteam/archive/2004/01/20/60719.aspx et http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_20926988.html
Ils discutent à propos de
lock(this)
trop et décourager de l'utiliser depuis:Citant EE:
Juste avoir un coup d'œil et a constaté que les appareils portables ne prennent pas en charge MethodImplOptions.Synchronisé.
Il y a aussi une remarque:
source: http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.methodimploptions%28v=VS.100%29.aspx
Je pense que la différence dépendrait de ce que les objets sont référencés dans la décorées méthodes. De ce que j'ai lu, la décoration en fait met en œuvre lock() dans l'ILLINOIS.
La meilleure approche serait de faire le plus spécifique de verrouillage comme nécessaire.
Cet article peut vous aider: http://www.yoda.arachsys.com/csharp/threads/lockchoice.shtml
En général, je voudrais éviter le blocage sur "cela", comme privé de verrouillage de variables, d'offrir un meilleur contrôle. Je recommande de verrouillage sur 'cette', si c'est une classe de collection personnalisé, quelque chose le long des lignes de SyncRoot, si c'est ce qui est nécessaire.
Hasanain