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
Libérer: 2025-01-31 06:11:09
original
387 Les gens l'ont consulté

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:

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); // Simulate a long operation

        }

    }

}

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!

Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal