Y-a-t-il une différence entre ceci :
internal class MyClass
{
private readonly object _syncRoot = new Object();
public void DoSomething()
{
lock(_syncRoot)
{
...
}
}
public void DoSomethingElse()
{
lock(_syncRoot)
{
...
}
}
}
et ceci :
internal class MyClass
{
[MethodImpl(MethodImplOptions.Synchronized)]
public void DoSomething()
{
...
}
[MethodImpl(MethodImplOptions.Synchronized)]
public void DoSomethingElse()
{
...
}
}
La seule différence que je vois est que la première approche verrouille un membre privé alors que la seconde approche verrouille l'instance elle-même (elle devrait donc verrouiller tout le reste de l'instance). Y a-t-il un conseil général sur l'approche à utiliser ? J'ai actuellement trouvé deux classes avec un objectif similaire dans notre projet, chacune écrite avec une approche différente.
Editar:
Peut-être une autre question. Est-ce que c'est ça :
internal class MyClass
{
[MethodImpl(MethodImplOptions.Synchronized)]
public void DoSomething()
{
...
}
}
exactement la même chose que ça :
internal class MyClass
{
public void DoSomething()
{
lock(this)
{
...
}
}
}
4 votes
Vérifier stackoverflow.com/questions/541194/
0 votes
@Winston : Super. Ma question est presque une copie.
0 votes
Je considérerais la forme de l'attribut comme une "suggestion polie" au compilateur. Je ne suis pas sûr qu'ils soient tenus par la norme de la suivre. Alors que l'utilisation explicite d'un
lock
impose une exigence au moment de la compilation.1 votes
@sixlet Une suggestion polie ne serait pas très utilisable/fiable, n'est-ce pas ?
2 votes
@Henk : Je dis simplement que je ne me souviens pas qu'il ait été verrouillé par une norme quelconque comme "devant être mis en œuvre" par un CLR conforme.