Maison >Java >javaDidacticiel >Comment réparer : erreur de concurrence Java : blocage du thread

Comment réparer : erreur de concurrence Java : blocage du thread

WBOY
WBOYoriginal
2023-08-18 17:57:15673parcourir

Comment réparer : erreur de concurrence Java : blocage du thread

Comment résoudre : Erreur de concurrence Java : blocage des threads

Introduction :
En programmation simultanée, le blocage des threads est un problème très courant. Lorsque plusieurs threads sont en compétition pour les ressources, un blocage peut se produire si les threads attendent les uns les autres pour libérer des ressources. Cet article présentera le concept de blocage de thread, ses causes et comment résoudre ce problème.

  1. Le concept de blocage de thread
    Lorsque plusieurs threads s'attendent pour libérer des ressources, tous les threads sont incapables de continuer à s'exécuter, formant ainsi un blocage de thread. L'apparition d'un blocage de thread est généralement causée par le fait que les quatre conditions suivantes sont vraies en même temps :
  2. Condition d'exclusion mutuelle : une ressource n'est autorisée à être accessible que par un seul thread à la fois.
  3. Conditions de demande et de maintien : lorsqu'un thread occupe des ressources, il demande également des ressources occupées par d'autres threads.
  4. Aucune condition de privation : La ressource ne peut être libérée que par le thread qui la possède, et les autres threads ne peuvent pas la priver.
  5. Condition d'attente de boucle : il existe une séquence d'attente de thread dans laquelle chaque thread attend que le thread suivant libère des ressources.
  6. Causes du blocage des threads
    Les blocages des threads sont généralement causés par les raisons suivantes :
  7. Conflit de ressources : plusieurs threads sont en compétition pour la même ressource en même temps sans stratégie de planification appropriée, ce qui entraîne un blocage.
  8. Interblocage des ordres de verrouillage : les threads acquièrent des verrous dans des ordres différents, ce qui les oblige à attendre que l'autre libère le verrou.
  9. Les threads s'attendent : le thread A attend que le thread B libère le verrou, et le thread B attend que le thread A libère le verrou, ce qui entraîne une impasse.
  10. Méthodes pour résoudre le blocage des threads
    Afin de résoudre le problème de blocage des threads, nous pouvons envisager les méthodes suivantes :

3.1 Éviter l'attente circulaire
L'attente circulaire est l'une des principales causes de blocage des threads. Afin d'éviter une attente circulaire, vous pouvez utiliser un algorithme de tri des ressources, qui oblige les threads à acquérir les verrous dans un certain ordre et à les libérer dans le même ordre. Cela élimine la possibilité d’attendre en boucle.

3.2 Unifier l'ordre de verrouillage
Une situation courante dans l'impasse des threads est que différents threads acquièrent des verrous dans des ordres différents, ce qui les oblige à s'attendre les uns les autres. Pour résoudre ce problème, on peut stipuler que tous les threads doivent acquérir les verrous dans le même ordre. Cela peut éviter l'apparition d'un blocage de séquence de verrouillage.

3.3 Utiliser le mécanisme de délai d'attente de verrouillage
Dans la programmation multi-thread, le mécanisme de délai d'attente de verrouillage peut être utilisé pour éviter un blocage de thread. Lorsqu'un thread tente d'acquérir un verrou pendant plus d'un certain délai et ne parvient pas à acquérir le verrou, il peut choisir d'abandonner l'acquisition du verrou et d'essayer d'autres méthodes de traitement.

Ce qui suit est un exemple de code qui utilise le mécanisme de délai d'attente du verrou pour éviter le blocage des threads :

public class DeadlockExample {
    private static Object lock1 = new Object();
    private static Object lock2 = new Object();

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (lock1) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock2) {
                    System.out.println("Thread 1");
                }
            }
        }).start();

        new Thread(() -> {
            synchronized (lock2) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock1) {
                    System.out.println("Thread 2");
                }
            }
        }).start();

        // 设置超时时间为2秒
        CompletableFuture<Object> future = CompletableFuture.supplyAsync(() -> {
            while (true) {
                if (Thread.holdsLock(lock1) && Thread.holdsLock(lock2)) {
                    return true;
                }
            }
        }).orTimeout(2000, TimeUnit.MILLISECONDS);
        try {
            future.get();
        } catch (TimeoutException e) {
            System.out.println("Deadlock detected!");
            // 执行适当的处理逻辑
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}
  1. Résumé
    Le blocage des threads est l'un des problèmes courants dans la programmation simultanée. Pour résoudre le problème de blocage des threads, nous pouvons éviter l'attente de boucle, unifier la séquence de verrouillage et utiliser le mécanisme de délai d'expiration du verrouillage. Grâce à des stratégies et des moyens techniques appropriés, les problèmes causés par le blocage des threads peuvent être efficacement évités et la robustesse et les performances des programmes concurrents peuvent être améliorées.

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