Si vous passez un type de valeur, il sera enchaîné, et la prochaine fois que le code s’exécute ici, il sera à nouveau enchaîné, et il ne sera pas le même objet deux fois, donc il ne peut pas être verrouillé
Verrou(x)
{ ...
}
Le verrouillage se fait en fait via l’objet Monitor :
Ce qui précède est équivalent à :
System.Objet obj = (System.Object)x ; System.Threading.Monitor.Enter(obj) ; essaie
{ ...
} finalement
{ System.Threading.Monitor.Exit(obj) ;
}
Pour citer les mots originaux du MSDN : Utilisez Monitor pour verrouiller des objets (c’est-à-dire des types de référence), pas des types de valeurs. Lorsque vous passez une variable de type avalue à Entrée, elle est encadrée comme un objet. Si vous passez à nouveau la même variable à Entrée, elle est encadrée comme un objet séparé, et le thread ne bloque pas. Dans ce cas, le code que Monitor est censé protéger n’est pas protégé. De plus, lorsque vous passez la variable à Sortie, un autre objet séparé est créé. Parce que l’objet passé à Sortie est différent de l’objet passé à Entrée, le Moniteur lance SynchronizationLockException. Pour plus d’informations, voir le sujet conceptuel Monitors. |