"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Multithreading : concepts clés pour les ingénieurs - Partie 1

Multithreading : concepts clés pour les ingénieurs - Partie 1

Publié le 2024-11-08
Parcourir:263

Multithreading : Key Concepts for Engineers - Part 1

Comprendre les concepts clés du multithreading est crucial pour les développeurs de logiciels, car cela améliore non seulement l'ensemble des compétences, mais a également un impact direct sur le développement d'applications, l'évolutivité et la qualité globale des solutions logicielles.

Atomicité

Dans le contexte du multithreading, les opérations atomiques garantissent qu'un thread peut exécuter une série d'actions sans interruption de la part des autres threads. Plusieurs threads peuvent tenter de lire ou d'écrire des données partagées simultanément. Sans atomicité, les modifications simultanées peuvent conduire à des résultats incohérents ou inattendus, communément appelés conditions de concurrence.

La spécification Java garantit que la « lecture » et « l'écriture » sont des opérations atomiques et non leurs combinaisons. donc une opération qui « lit, ajoute 1 puis réécrit le résultat » n'est pas atomique selon les spécifications. de telles opérations sont appelées opérations composées et elles doivent généralement être atomiques dans le contexte de leur utilisation dans notre code.

Exemples d'opérations atomiques :

  1. Incrémentation d'un compteur : Si deux threads incrémentent un compteur en même temps sans atomicité, ils peuvent tous deux lire la même valeur et réécrire la même valeur incrémentée, entraînant une perte d'un incrément.

  2. Mise à jour d'une variable partagée : Si un thread lit une valeur pendant qu'un autre la modifie, sans atomicité, le thread de lecture peut obtenir une valeur incohérente.

Atteindre l'atomicité :

  • Classes atomiques : de nombreux langages de programmation fournissent des classes atomiques (par exemple, AtomicIntegerin Java) qui encapsulent des opérations dont le caractère atomique est garanti.

  • Méthodes/blocs synchronisés : dans des langages comme Java, vous pouvez utiliser le mot-clé synchronisé pour garantir qu'un seul thread peut exécuter un bloc de code ou une méthode à la fois.

  • Verrous : utilisation de verrous explicites (par exemple, ReentrantLockin Java) pour gérer l'accès aux ressources partagées.

Avantages

  • Performances : Les classes de java.util.concurrent.atomic fournissent également une approche sans verrouillage pour garantir la sécurité des threads, ce qui en fait un choix privilégié dans de nombreux scénarios.
  • Simplicité : L'utilisation de classes atomiques simplifie le code, car les développeurs n'ont pas besoin de gérer les verrous et peuvent se concentrer sur la logique du programme.
  • Sécurité des threads : Les opérations atomiques garantissent que les variables sont mises à jour en toute sécurité sur plusieurs threads sans risque de corruption des données ou de conditions de concurrence.

Immutabilité

L'immuabilité fait référence à la propriété d'un objet dont l'état ne peut pas être modifié après sa création. En programmation, les objets immuables sont ceux qui, une fois initialisés, ne peuvent être modifiés ou altérés. Au lieu de modifier un objet immuable, un nouvel objet est créé avec les modifications souhaitées.

Immuable signifie qu'une fois que le constructeur d'un objet a terminé son exécution, cette instance ne peut plus être modifiée.

Caractéristiques des objets immuables

  • Aucun changement d'état : Une fois qu'un objet immuable est créé, son état (attributs ou champs) reste constant tout au long de sa durée de vie.

  • Thread-Safe : Les objets immuables peuvent être partagés en toute sécurité entre plusieurs threads sans avoir besoin de synchronisation, car ils ne peuvent pas être modifiés.

  • Stabilité du hashcode : Le hashcode d'un objet immuable reste le même tout au long de sa durée de vie, ce qui le rend adapté à une utilisation dans des collections basées sur le hachage comme HashMap ou HashSet.

Atteindre l'immuabilité :

  • Utilisation des enregistrements (en Java 14) : En Java, la fonction d'enregistrement fournit un moyen concis de créer des classes de données immuables.
public record ImmutablePoint(int x, int y) {}
  • Utiliser des structures de données immuables : Utiliser des structures de données immuables existantes fournies par le langage de programmation ou les bibliothèques, telles que :
  1. Java : Collections.unmodifiableList(), List.of(), Set.of()

  2. C# : ImmutableList, ImmutableArray de System.Collections.Immutable

  3. Python : Les tuples sont intrinsèquement immuables.

  • Utiliser les champs finaux : Déclarez les champs d'une classe comme finaux. Cela garantit que les champs ne peuvent être attribués qu'une seule fois, lors de la construction de l'objet.

  • Aucun setter : Évitez de fournir des méthodes setter pour les champs mutables. Cela empêche le code externe de modifier l'état d'un objet après sa construction.

public final class ImmutablePoint {
    private final int x;
    private final int y;

    public ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}
  • Méthodes d'usine statique : Au lieu de fournir un constructeur public, utilisez des méthodes d'usine statique qui renvoient de nouvelles instances de l'objet, en indiquant clairement que l'état ne peut pas être modifié

  • Modèle de générateur (pour les objets complexes) : Pour les objets qui nécessitent de nombreux paramètres, utilisez le modèle de générateur pour créer des objets immuables. Le constructeur accumule les paramètres et construit une instance immuable à la fin.

Avantages

  • Concurrency : Si la structure interne d'un objet immuable est valide, elle le sera toujours. Il n'y a aucune chance que différents threads puissent créer un état invalide au sein de cet objet. Par conséquent, les objets immuables sont Thread Safe.

  • Garbage collection : Il est beaucoup plus facile pour le ramasse-miettes de prendre des décisions logiques concernant les objets immuables.

Sortie

S'armer de ces connaissances améliore non seulement votre capacité à écrire du code haute performance, mais vous prépare également aux défis du développement de logiciels modernes, où la réactivité et l'évolutivité sont primordiales. Alors que vous poursuivez votre voyage dans le monde du multithreading, n'oubliez pas que chaque concept que vous maîtriserez contribuera à votre croissance en tant que développeur et à votre capacité à créer des applications qui répondent et dépassent les attentes des utilisateurs.

Restez à l'écoute car nous nous concentrerons sur la famine, les blocages, les conditions de concurrence, la planification du système d'exploitation et bien plus encore dans le prochain article, qui améliorerait vos compétences en programmation et stimulerait votre carrière !

Références

Un immense merci à la documentation en ligne, à la communauté et à toutes les ressources disponibles qui ont rendu cet article possible.

  1. Info-graphique
  2. Comprendre les concepts de base du multithreading
  3. Atomicité
  4. Ce qui est immuable

Avertissement : cet article est assisté par l'IA. La structure de l'article et la liste d'idées sont 100 % organisées et recherchées manuellement. Je relis tous les textes générés par l'IA pour garantir l'exactitude des informations et ajouter quelques contextes

Déclaration de sortie Cet article est reproduit sur : https://dev.to/anwaar/multithreading-key-concepts-for-engineers-part-1-4g73?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3