Maison >développement back-end >C++ >Pourquoi l'utilisation de `Lock (this) 'en C # multithread est-elle découragée?

Pourquoi l'utilisation de `Lock (this) 'en C # multithread est-elle découragée?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-31 06:11:09331parcourir

Why is using `lock(this)` in multithreaded C# discouraged?

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

:
  1. Verrouillage incontrôlé: Les objets accessibles au public signifient this n'importe quel code

    peut acquérir le verrouillage sur
  2. . Cela ouvre la porte à des problèmes de synchronisation imprévisibles, ce qui rend le code multithread plus difficile à concevoir et à déboguer correctement.
  3. 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.
  4. expose la mise en œuvre du verrouillage, compromettant ce principe de conception crucial.
  5. 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

  6. . Si un autre thread maintient le verrou, les tentatives suivantes se bloqueront, mais l'objet lui-même reste modifiable.
  7. 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
  8. ) pour le verrouillage à la place.

Exemple illustratif:

<code class="language-csharp">public class Person
{
    public int Age { get; set; }
    public string Name { get; set; }

    public void LockThis()
    {
        lock (this)
        {
            System.Threading.Thread.Sleep(10000); // Simulate a long operation
        }
    }
}</code>
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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn