Aller au contenu

Java — Deadlock (Blocage en concurrence)

Le deadlock est un problème avancé en programmation concurrente. Il peut bloquer complètement une application sans afficher d’erreur, ce qui le rend particulièrement dangereux.


Définition simple

Un deadlock se produit lorsque :

deux threads (ou plus) se bloquent mutuellement chacun attend une ressource détenue par l’autre

➡️ Résultat : aucun ne peut continuer


Exemple classique

Object lock1 = new Object();
Object lock2 = new Object();

Thread t1 = new Thread(() -> {
    synchronized(lock1) {
        synchronized(lock2) {
            System.out.println("t1");
        }
    }
});

Thread t2 = new Thread(() -> {
    synchronized(lock2) {
        synchronized(lock1) {
            System.out.println("t2");
        }
    }
});

💥 Que se passe-t-il ?

Scénario possible :

  • t1 prend lock1
  • t2 prend lock2
  • t1 attend lock2
  • t2 attend lock1

Résultat :

💣 blocage total (deadlock)


Visualisation

  • Thread 1 → attend une ressource détenue par Thread 2
  • Thread 2 → attend une ressource détenue par Thread 1

boucle bloquée, rien n’avance


Pourquoi c’est critique

  • aucune erreur visible
  • application figée
  • difficile à reproduire
  • difficile à diagnostiquer

Dans des systèmes sensibles (finance, trading…), c’est un problème majeur


🛠️ Comment éviter un deadlock

1. Ordre des locks

Toujours acquérir les verrous dans le même ordre

  • Bon :
lock1 → lock2
  • Mauvais :
lock2 → lock1

2. Timeout avec tryLock

lock.tryLock(1, TimeUnit.SECONDS);

permet d’éviter un blocage infini


3. Réduire les locks

moins de verrous = moins de risques


4. Simplifier

utiliser un seul lock si possible


Différence avec race condition

Race Condition Deadlock
problème incohérence blocage
cause pas de synchro trop de locks
résultat données fausses système figé

Pièges fréquents

  • ignorer l’ordre des locks
  • multiplier les verrous
  • ne pas utiliser de stratégie de sortie (tryLock)
  • créer des dépendances circulaires

Questions classiques

Q1

C’est quoi un deadlock ? Blocage mutuel entre threads


Q2

Cause principale ? Ordre incohérent des locks


Q3

Solution ? Ordre des locks / tryLock / simplification


Q4

Deadlock ou race condition → lequel bloque le système ? Deadlock


À retenir

  • un deadlock = blocage total entre threads
  • il est causé par des dépendances circulaires
  • il ne génère pas forcément d’erreur visible
  • il doit être évité dès la conception

🧾 En résumé

  • plusieurs threads se bloquent en attendant des ressources
  • aucun ne peut avancer → système figé
  • cause principale : ordre incohérent des locks
  • solutions : ordre strict, tryLock, réduire les verrous

Le deadlock est un bug rare mais critique : il peut stopper complètement une application sans prévenir.


Voir aussi