Pourquoi lock(this)
est problématique dans C #
Multithread C #
lock(this)
La documentation de Microsoft conseille d'utiliser
pour protéger l'accès à l'objet si cet objet est accessible au public. Explorons les raisons de cette recommandation.
lock(this)
risques clés de l'utilisation de
:
-
Verrouillage incontrôlé: Les objets accessibles au public signifient this
n'importe quel code
peut acquérir le verrouillage sur . Cela ouvre la porte à des problèmes de synchronisation imprévisibles, ce qui rend le code multithread plus difficile à concevoir et à déboguer correctement. -
lock(this)
Violation de l'encapsulation:
L'utilisation de champs privés et d'objets de verrouillage dédiés est généralement préféré. Cette approche applique le contrôle d'accès et maintient le mécanisme de verrouillage interne, préservant l'encapsulation. expose la mise en œuvre du verrouillage, compromettant ce principe de conception crucial. -
lock
Misonctant du comportement de lock(this)
: Une idée fausse commune est que fait en quelque sorte l'objet en lecture seule. Ceci est incorrect. L'objet agit uniquement comme une clé de verrouillage
. Si un autre thread maintient le verrou, les tentatives suivantes se bloqueront, mais l'objet lui-même reste modifiable. -
object
Verrouillage sur des types immuables:
Ne jamais verrouiller les types immuables comme les chaînes. Ceux-ci sont souvent partagés à travers l'application, conduisant à des impasses ou à un comportement inattendu. Utilisez un objet privé et mutable (comme une instance dédiée ) pour le verrouillage à la place.
Exemple illustratif:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Person
{
public int Age { get; set; }
public string Name { get; set; }
public void LockThis()
{
lock (this)
{
System.Threading.Thread.Sleep(10000);
}
}
}
|
Copier après la connexion
Considérez ce code C #:
LockThis()
this
Cet exemple met en évidence le problème. Alors que Name
maintient le verrou sur lock(this)
, un autre thread pourrait toujours modifier
simultanément, démontrant que n'évalent pas intrinsèquement la modification. Ce manque de protection garantie est la principale raison de l'avertissement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!