Le mot-clé volatile
en Java est utilisé pour indiquer au compilateur que la variable déclarée comme volatile
peut être accédée simultanément par plusieurs threads. C'est un mécanisme pour garantir la visibilité et l'ordre des opérations dans un contexte multi-thread.
Une variable volatile
en Java est une variable dont la valeur peut être modifiée par plusieurs threads. Dans un environnement multi-thread, lorsque chaque thread a sa propre copie de la variable dans la mémoire cache, une modification d'une variable par un thread peut ne pas être immédiatement visible par les autres threads. C'est ce qu'on appelle un problème de visibilité.
Le mot-clé volatile
résout ce problème en garantissant qu'à chaque fois qu'une variable est lue, elle est lue directement de la mémoire principale, et chaque fois qu'elle est écrite, elle est écrite directement dans la mémoire principale. De cette façon, chaque thread voit toujours la dernière valeur écrite dans la variable.
Voici un exemple simple d'utilisation de volatile
en Java :
public class MonThread extends Thread {
private volatile boolean running = true;
public void run() {
while (running) {
// code pour exécuter le thread
}
}
public void stopRunning() {
running = false;
}
}
Dans cet exemple, la variable running
est déclarée comme volatile
. Cela signifie que si un autre thread appelle la méthode stopRunning()
, le changement de la valeur de running
à false
sera immédiatement visible par le thread qui exécute la boucle while
, et le thread s'arrêtera.
Il est important de noter que volatile
ne garantit pas l'atomicité. L'atomicité signifie qu'une opération (ou toutes les opérations dans un bloc) est complétée en une seule fois sans être interrompue par un autre thread. Les opérations comme i++
qui semblent être une seule opération sont en fait composées de trois étapes distinctes : lire la valeur de i
, incrémenter la valeur, puis écrire la nouvelle valeur dans i
. Si plusieurs threads exécutent i++
en même temps sur une variable volatile
i, ils peuvent obtenir des résultats inattendus parce que ces opérations ne sont pas atomiques.
Finalement, volatile
est un outil précieux pour la communication inter-thread en Java, mais il faut l'utiliser avec soin et comprendre ses limitations. Dans des situations plus complexes où vous avez besoin d'atomicité ou de synchronisation plus complète, les primitives de synchronisation comme synchronized
, ReentrantLock
, Semaphore
, etc. peuvent être plus appropriées.