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.