Maison Java javaDidacticiel Comment réparer : erreur de multithreading Java : condition de concurrence

Comment réparer : erreur de multithreading Java : condition de concurrence

Aug 27, 2023 pm 01:22 PM
多线程 解决 condition de course

Comment réparer : erreur de multithreading Java : condition de concurrence

Comment résoudre : erreur multithread Java : condition de concurrence

Introduction :
Dans la programmation multithread Java, les conditions de concurrence sont un problème courant. Cela fait référence au fait que lorsque plusieurs threads accèdent et modifient des données partagées en même temps, cela peut conduire à des résultats de programme indéterminés. Cet article présente le concept de conditions de concurrence et fournit quelques méthodes pour résoudre les conditions de concurrence.

1. Quelles sont les conditions de concurrence ?
Une condition de concurrence critique signifie que lorsque plusieurs threads exécutent du code, ils lisent et écrivent des données partagées, mais l'ordre et l'heure d'exécution ne peuvent pas être déterminés, ce qui entraîne une incertitude dans les résultats. Plus précisément, les conditions suivantes doivent être remplies pour générer une condition de concurrence critique :

  1. Plusieurs threads accèdent aux données partagées en même temps.
  2. Au moins un thread effectue des opérations d'écriture sur les données partagées.
  3. L'ordre d'exécution et le temps entre les threads ne peuvent pas être déterminés.

2. Exemples de conditions de concurrence critique
L'exemple de code suivant montre un problème de condition de concurrence classique : plusieurs threads incrémentent une variable partagée en même temps.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

public class RaceConditionDemo {

    private static int count = 0;

     

    public static void increment() {

        count++;

    }

     

    public static void main(String[] args) throws InterruptedException {

        Thread t1 = new Thread(() -> {

            for (int i = 0; i < 1000; i++) {

                increment();

            }

        });

         

        Thread t2 = new Thread(() -> {

            for (int i = 0; i < 1000; i++) {

                increment();

            }

        });

         

        t1.start();

        t2.start();

        t1.join();

        t2.join();

         

        System.out.println("Count: " + count);

    }

}

Copier après la connexion

Le code ci-dessus crée deux threads t1 et t2, qui incrémentent le nombre de variables partagées. Cependant, étant donné que l'ordre d'exécution et le timing entre les threads ne peuvent pas être déterminés, une condition de concurrence critique peut se produire lorsque deux threads effectuent des opérations d'incrémentation en même temps. Sans un mécanisme de synchronisation correct pour garantir l'atomicité de l'opération, le résultat final peut être inférieur à la valeur attendue de 2000.

3. Méthodes pour résoudre les conditions de concurrence
Pour résoudre le problème des conditions de concurrence dans le multi-threading Java, vous pouvez utiliser les méthodes suivantes :

  1. Utilisez le mot-clé synchronisé
    Le mot-clé synchronisé peut garantir qu'un seul thread peut entrer dans le fil. en même temps Un bloc de code ou une méthode marquée synchronisée. Le code ci-dessus peut être modifié comme suit :

1

2

3

4

5

6

7

8

9

10

public class SynchronizedDemo {

    private static int count = 0;

     

    public synchronized static void increment() {

        count++;

    }

     

    // 省略其他代码

     

}

Copier après la connexion

En marquant la méthode incrément() comme synchronisée, nous pouvons garantir qu'un seul thread peut exécuter cette méthode à tout moment. Cette approche peut éliminer efficacement les conditions de concurrence et garantir l’atomicité des opérations.

  1. Utilisation de l'interface Lock
    En plus d'utiliser le mot-clé synchronisé, nous pouvons également utiliser l'interface Lock pour contrôler l'accès aux ressources partagées. Voici l'exemple de code amélioré :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

 

public class LockDemo {

    private static int count = 0;

    private static Lock lock = new ReentrantLock();

     

    public static void increment() {

        lock.lock();

        try {

            count++;

        } finally {

            lock.unlock();

        }

    }

     

    // 省略其他代码

     

}

Copier après la connexion

Dans cet exemple, nous créons un objet Lock pour contrôler l'accès aux variables partagées en appelant les méthodes lock() et unlock(). L’utilisation de l’interface Lock peut fournir un contrôle plus fin et est plus flexible que synchronisée.

  1. Utiliser des classes atomiques
    Java fournit certaines classes atomiques, telles que AtomicInteger, qui peuvent être utilisées pour implémenter des opérations d'incrémentation sécurisées pour les threads. Voici un exemple de code amélioré utilisant AtomicInteger :

1

2

3

4

5

6

7

8

9

10

11

12

import java.util.concurrent.atomic.AtomicInteger;

 

public class AtomicDemo {

    private static AtomicInteger count = new AtomicInteger(0);

     

    public static void increment() {

        count.incrementAndGet();

    }

     

    // 省略其他代码

     

}

Copier après la connexion

L'utilisation de la classe AtomicInteger garantit que l'incrémentation du nombre est atomique et ne sera pas affectée par les conditions de concurrence.

Résumé :
Les conditions de concurrence sont un problème courant dans la programmation multithread Java, qui peut conduire à une incertitude dans les résultats de l'exécution du programme. Afin de résoudre le problème des conditions de concurrence, nous pouvons utiliser des méthodes telles que le mot-clé synchronisé, l'interface Lock ou les classes atomiques pour garantir que l'accès aux ressources partagées est thread-safe. En utilisant ces techniques de manière appropriée, nous pouvons réduire les problèmes causés par les conditions de concurrence et améliorer les performances et la fiabilité des programmes multithread.

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

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Exceptions de fonctions C++ et multithreading : gestion des erreurs dans les environnements concurrents Exceptions de fonctions C++ et multithreading : gestion des erreurs dans les environnements concurrents May 04, 2024 pm 04:42 PM

Exceptions de fonctions C++ et multithreading : gestion des erreurs dans les environnements concurrents

Utilisation du framework de tests unitaires JUnit dans un environnement multithread Utilisation du framework de tests unitaires JUnit dans un environnement multithread Apr 18, 2024 pm 03:12 PM

Utilisation du framework de tests unitaires JUnit dans un environnement multithread

Comment la concurrence et le multithreading des fonctions Java peuvent-ils améliorer les performances ? Comment la concurrence et le multithreading des fonctions Java peuvent-ils améliorer les performances ? Apr 26, 2024 pm 04:15 PM

Comment la concurrence et le multithreading des fonctions Java peuvent-ils améliorer les performances ?

Comment se comportent les fonctions PHP dans un environnement multithread ? Comment se comportent les fonctions PHP dans un environnement multithread ? Apr 16, 2024 am 10:48 AM

Comment se comportent les fonctions PHP dans un environnement multithread ?

Comment implémenter le multi-threading en PHP ? Comment implémenter le multi-threading en PHP ? May 06, 2024 pm 09:54 PM

Comment implémenter le multi-threading en PHP ?

Comment gérer les ressources partagées en multi-threading en C++ ? Comment gérer les ressources partagées en multi-threading en C++ ? Jun 03, 2024 am 10:28 AM

Comment gérer les ressources partagées en multi-threading en C++ ?

Défis et contre-mesures de la gestion de la mémoire C++ dans un environnement multithread ? Défis et contre-mesures de la gestion de la mémoire C++ dans un environnement multithread ? Jun 05, 2024 pm 01:08 PM

Défis et contre-mesures de la gestion de la mémoire C++ dans un environnement multithread ?

Défis et stratégies pour tester les programmes multithread en C++ Défis et stratégies pour tester les programmes multithread en C++ May 31, 2024 pm 06:34 PM

Défis et stratégies pour tester les programmes multithread en C++

See all articles