Java — volatile
Le mot-clé volatile en Java est essentiel dès qu’on travaille avec plusieurs threads. Il permet d’éviter des bugs subtils liés à la mémoire et à la visibilité des données.
Idée simple
volatile garantit :
la visibilité des variables entre threads
Concrètement :
- si un thread modifie une variable
- les autres threads voient immédiatement la nouvelle valeur
Problème sans volatile
boolean running = true;
Thread t = new Thread(() -> {
while (running) {
// boucle infinie possible
}
});
running = false;
Problème :
- le thread peut ne jamais voir la mise à jour
- il continue à tourner indéfiniment
💥 C’est un bug réel qu’on peut rencontrer en production
Solution avec volatile
volatile boolean running = true;
Maintenant :
- chaque thread lit toujours la valeur à jour
- la boucle peut s’arrêter correctement
Ce que fait vraiment volatile
volatile garantit :
- ✔️ visibilité mémoire
- ❌ pas d’atomicité
Piège majeur
Beaucoup pensent :
“volatile = thread-safe”
- Faux
Exemple important
volatile int count = 0;
count++; // ❌ pas thread-safe
Pourquoi ?
count++ correspond à plusieurs étapes :
- lire la valeur
- l’incrémenter
- écrire le résultat
Avec plusieurs threads → conflits possibles
Résumé clé
| Concept | volatile |
|---|---|
| visibilité | ✔️ |
| atomicité | ❌ |
| lock | ❌ |
Quand utiliser volatile
Bon cas
- variables de type flag (
running,stop) - état simple partagé
- lecture/écriture sans logique complexe
Mauvais cas
- compteur (
count++) - opérations multiples
- logique critique concurrente
Différence avec synchronized
| volatile | synchronized | |
|---|---|---|
| visibilité | ✔️ | ✔️ |
| atomicité | ❌ | ✔️ |
| lock | ❌ | ✔️ |
Pièges fréquents
- croire que
volatilerend le code thread-safe - l’utiliser pour des compteurs
- confondre visibilité et atomicité
Questions classiques
Q1
volatile garantit :
- A. atomicité
- B. visibilité
- C. lock
Réponse : B
Q2
volatile int count = 0;
count++;
Thread-safe ?
Non
Q3
Pourquoi utiliser volatile ?
Pour partager une variable simple entre threads
À retenir
volatilerend les modifications visibles immédiatement- il ne protège pas contre les accès concurrents
- pour des opérations complexes → utiliser
synchronizedou des outils adaptés
🧾 En résumé
volatilegarantit la visibilité entre threads- il ne garantit ni atomicité ni sécurité complète
- il est utile pour des cas simples (flags, états)
- il ne remplace pas les mécanismes de synchronisation
C’est un outil simple, mais crucial pour éviter certains bugs en environnement concurrent.