Maison Java javaDidacticiel Comment réparer : erreur de concurrence Java : évitement des blocages

Comment réparer : erreur de concurrence Java : évitement des blocages

Aug 19, 2023 pm 01:54 PM
java 并发 死锁避免

Comment réparer : erreur de concurrence Java : évitement des blocages

Comment résoudre : Erreur de concurrence Java : éviter les blocages

Introduction :

Dans le développement de programmes Java, la concurrence multithread est essentielle. Cependant, la programmation simultanée pose également certains problèmes, l'un des problèmes les plus courants et potentiellement graves étant le blocage. Le blocage fait référence à une situation dans laquelle deux threads ou plus détiennent les ressources requises l'un par l'autre, mais ne peuvent pas continuer l'exécution car l'autre partie ne libère pas les ressources. Cet article explorera comment résoudre les problèmes de blocage dans les erreurs de concurrence en Java et fournira quelques exemples de code.

1. Comprendre les causes de l'impasse :

Avant de résoudre le problème de l'impasse, vous devez d'abord comprendre la cause de l'impasse. Un blocage se produit généralement lorsque plusieurs threads sont en concurrence pour plusieurs ressources en même temps. Un blocage se produit lorsque deux threads ou plus s'attendent pour libérer une ressource requise. Voici un exemple de code simple :

class Resource {
    private String name;

    public Resource(String name) {
        this.name = name;
    }

    public synchronized void doSomething() {
        System.out.println(name + " is doing something.");
    }

    public synchronized void doAnotherthing(Resource otherResource) {
        System.out.println(name + " is doing anotherthing.");
        otherResource.doSomething();
    }
}

public class DeadlockExample {
    public static void main(String[] args) {
        Resource resource1 = new Resource("Resource1");
        Resource resource2 = new Resource("Resource2");

        Thread t1 = new Thread(() -> {
            resource1.doAnotherthing(resource2);
        });

        Thread t2 = new Thread(() -> {
            resource2.doAnotherthing(resource1);
        });

        t1.start();
        t2.start();
    }
}
Copier après la connexion

Dans l'exemple ci-dessus, il y a deux ressources resource1 et resource2. Deux threads t1 et t2 sont créés dans la méthode main, et la méthode doAnotherthing de la ressource est appelée respectivement . Dans le thread t1, il appelle la méthode doAnotherthing de resource1 et passe resource2 en tant que paramètre. Dans le thread t2, il appelle la méthode doAnotherthing de resource2 et passe resource1 en tant que paramètre. resource1resource2。在main方法中创建了两个线程t1t2,并分别调用资源的doAnotherthing方法。在t1线程中,它调用resource1doAnotherthing方法,并传入resource2作为参数。在t2线程中,它调用resource2doAnotherthing方法,并传入resource1作为参数。

由于这两个线程互相等待对方释放所需的资源,所以会发生死锁。当然,这只是一个简单的示例,实际场景中可能包含更多资源和线程。

二、解决死锁问题:

  1. 预防死锁:

要预防死锁,首先需要了解死锁发生的原因。在上面的示例代码中,死锁是由于线程对资源的获取顺序不一致导致的。因此,我们可以通过规定线程获取资源的顺序来预防死锁。修改示例代码如下:

public class DeadlockExample {
    public static void main(String[] args) {
        Resource resource1 = new Resource("Resource1");
        Resource resource2 = new Resource("Resource2");

        Thread t1 = new Thread(() -> {
            synchronized (resource1) {
                System.out.println("Thread 1 acquired resource 1.");
                synchronized (resource2) {
                    System.out.println("Thread 1 acquired resource 2.");
                }
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized (resource1) {
                System.out.println("Thread 2 acquired resource 1.");
                synchronized (resource2) {
                    System.out.println("Thread 2 acquired resource 2.");
                }
            }
        });

        t1.start();
        t2.start();
    }
}
Copier après la connexion

通过对资源的获取顺序进行规定,确保不会出现互相等待对方所需的资源的情况,从而避免了死锁的发生。

  1. 死锁检测和恢复:

除了预防死锁,还可以通过死锁检测和恢复来解决死锁问题。Java提供了ThreadMXBean接口用于监测和管理线程的状态。以下是一个示例代码:

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;

public class DeadlockExample {
    public static void main(String[] args) {
        Resource resource1 = new Resource("Resource1");
        Resource resource2 = new Resource("Resource2");

        Thread t1 = new Thread(() -> {
            synchronized (resource1) {
                System.out.println("Thread 1 acquired resource 1.");

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                synchronized (resource2) {
                    System.out.println("Thread 1 acquired resource 2.");
                }
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized (resource2) {
                System.out.println("Thread 2 acquired resource 2.");

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                synchronized (resource1) {
                    System.out.println("Thread 2 acquired resource 1.");
                }
            }
        });

        t1.start();
        t2.start();

        ThreadMXBean threadMxBean = ManagementFactory.getThreadMXBean();
        long[] deadlockedThreadIds = threadMxBean.findDeadlockedThreads();

        if (deadlockedThreadIds != null) {
            ThreadInfo[] threadInfos = threadMxBean.getThreadInfo(deadlockedThreadIds);
            for (ThreadInfo threadInfo : threadInfos) {
                System.out.println(threadInfo.getThreadName() + " is deadlocked.");
                // 恢复死锁线程的执行,或者进行其他操作
            }
        }
    }
}
Copier après la connexion

在上面的示例代码中,我们通过ThreadMXBeanfindDeadlockedThreads

Une impasse se produit lorsque ces deux threads s'attendent pour libérer les ressources requises. Bien sûr, il ne s’agit que d’un exemple simple, et les scénarios réels peuvent inclure davantage de ressources et de threads.

2. Résoudre le problème de l'impasse :

Prévenir l'impasse :

  1. Pour éviter l'impasse, vous devez d'abord comprendre la cause de l'impasse. Dans l'exemple de code ci-dessus, le blocage est dû au fait que les threads acquièrent des ressources dans un ordre incohérent. Par conséquent, nous pouvons éviter les blocages en spécifiant l’ordre dans lequel les threads acquièrent les ressources. Modifiez l'exemple de code comme suit :
  2. rrreee
  3. En stipulant l'ordre dans lequel les ressources sont obtenues, il garantit que l'autre n'attend pas les ressources requises par l'autre partie, évitant ainsi l'apparition d'une impasse.
    1. Détection et récupération des blocages : 🎜🎜🎜En plus de prévenir les blocages, les problèmes de blocage peuvent également être résolus grâce à la détection et à la récupération des blocages. Java fournit l'interface ThreadMXBean pour surveiller et gérer l'état des threads. Voici un exemple de code : 🎜rrreee🎜Dans l'exemple de code ci-dessus, nous trouvons le thread où le blocage s'est produit via la méthode findDeadlockedThreads de ThreadMXBean et le gérons en conséquence. Vous pouvez reprendre l'exécution du thread bloqué ou effectuer d'autres opérations. 🎜🎜Conclusion : 🎜🎜Le blocage est l'un des problèmes courants dans la programmation simultanée multithread. S'il n'est pas résolu, il peut entraîner le blocage du programme ou l'impossibilité de poursuivre son exécution. Cet article présente deux méthodes pour résoudre le problème de blocage, à savoir la prévention des blocages et la détection et la récupération des blocages. Bien entendu, ce ne sont là que quelques solutions de base, et des stratégies plus complexes peuvent être nécessaires pour résoudre le problème de blocage dans les applications réelles. Les développeurs doivent veiller à éviter les blocages lors de l'écriture de programmes simultanés multithread et les gérer de manière appropriée pour garantir la stabilité et la fiabilité du programme. 🎜🎜Matériel de référence : 🎜🎜🎜[Programmation simultanée Java : compréhension approfondie de la synchronisation](https://www.jianshu.com/p/6d293a1a412c)🎜🎜[Analyse et solution du problème de blocage des threads Java](https : //blog .csdn.net/coslay/article/details/78387673)🎜🎜

    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

    Outils d'IA chauds

    Undresser.AI Undress

    Undresser.AI Undress

    Application basée sur l'IA pour créer des photos de nu réalistes

    AI Clothes Remover

    AI Clothes Remover

    Outil d'IA en ligne pour supprimer les vêtements des photos.

    Undress AI Tool

    Undress AI Tool

    Images de déshabillage gratuites

    Clothoff.io

    Clothoff.io

    Dissolvant de vêtements AI

    AI Hentai Generator

    AI Hentai Generator

    Générez AI Hentai gratuitement.

    Article chaud

    R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
    4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Meilleurs paramètres graphiques
    4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Comment réparer l'audio si vous n'entendez personne
    4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Commandes de chat et comment les utiliser
    4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

    Outils chauds

    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)

    Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

    Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

    Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

    Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

    Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

    Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

    Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

    Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

    Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

    Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

    Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

    Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

    Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

    Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

    Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

    Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

    See all articles