Le mot-clé volatile en Java est utilisé pour indiquer que la valeur d'une variable sera modifiée par différents threads. Il garantit que les modifications apportées à une variable sont toujours visibles par les autres threads, ce qui évite les problèmes de mise en cache des threads.
Utilisation
Le mot-clé volatile est principalement utilisé dans la programmation multithread pour garantir que les mises à jour d'une variable sont propagées de manière prévisible entre les threads.
Dans cet exemple, la variable running est marquée comme volatile. La méthode run vérifie la variable running dans une boucle. La méthode stopRunning définit running comme false, ce qui arrête la boucle. Le mot-clé volatile garantit que les modifications apportées à running sont immédiatement visibles par la méthode run.
Exemple 2 : Volatile avec plusieurs fils
publicclassVolatileCounter{private volatile int counter =0;publicvoidincrement(){
counter++;}public int getCounter(){return counter;}publicstaticvoidmain(String[] args) throws InterruptedException {
VolatileCounter vc =newVolatileCounter();
Runnable task =()->{for(int i =0; i <1000; i++){
vc.increment();}};
Thread t1 =newThread(task);
Thread t2 =newThread(task);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("Counter value: "+ vc.getCounter());}}Propulsé par
Dans cet exemple, la variable counter est marquée comme volatile. Deux threads incrémentent simultanément la variable counter. Le mot-clé volatile garantit que chaque thread voit la valeur la plus récente de counter.
Conseils et bonnes pratiques
Garantie de visibilité: Utilisez volatile pour garantir la visibilité des modifications apportées aux variables entre les différents threads. Il garantit qu'une lecture d'une variable volatile renvoie toujours l'écriture la plus récente de n'importe quel thread.
Atomicité: volatile ne garantit pas l'atomicité. Pour les actions composées (par exemple, les opérations d'incrémentation), envisagez d'utiliser d'autres mécanismes de synchronisation tels que les blocs synchronized ou AtomicInteger.
private AtomicInteger counter =newAtomicInteger(0);
counter.incrementAndGet();Propulsé par
Cas d'utilisation: Approprié pour les drapeaux, les variables d'état et d'autres variables pour lesquelles la dernière valeur est critique mais les opérations composées ne sont pas nécessaires.
Évitez la surutilisation: Une utilisation excessive de volatile peut entraîner des problèmes de performance. Ne l'utilisez que lorsque cela est nécessaire pour garantir la visibilité.
Combinez avec d'autres synchronisations: Dans les scénarios complexes, combinez volatile avec d'autres mécanismes de synchronisation pour garantir à la fois la visibilité et l'atomicité.
private volatile boolean flag =false;synchronized(this){
flag =true;}Propulsé par
Cohérence de la mémoire: Le mot-clé volatile permet d'éviter les erreurs de cohérence de la mémoire en établissant une relation "happens-before", garantissant que les modifications apportées à une variable volatile sont visibles par les autres threads.
Le mot-clé
volatileen Java est utilisé pour indiquer que la valeur d'une variable sera modifiée par différents threads. Il garantit que les modifications apportées à une variable sont toujours visibles par les autres threads, ce qui évite les problèmes de mise en cache des threads.Utilisation
Le mot-clé
volatileest principalement utilisé dans la programmation multithread pour garantir que les mises à jour d'une variable sont propagées de manière prévisible entre les threads.Syntax
dataType: Le type de la variable (par exemple,int,boolean, etc.).variableName: Le nom de la variable.Exemples
Exemple 1 : Utilisation de base
Dans cet exemple, la variable
runningest marquée commevolatile. La méthoderunvérifie la variablerunningdans une boucle. La méthodestopRunningdéfinitrunningcommefalse, ce qui arrête la boucle. Le mot-clévolatilegarantit que les modifications apportées àrunningsont immédiatement visibles par la méthoderun.Exemple 2 : Volatile avec plusieurs fils
Dans cet exemple, la variable
counterest marquée commevolatile. Deux threads incrémentent simultanément la variablecounter. Le mot-clévolatilegarantit que chaque thread voit la valeur la plus récente decounter.Conseils et bonnes pratiques
volatilepour garantir la visibilité des modifications apportées aux variables entre les différents threads. Il garantit qu'une lecture d'une variable volatile renvoie toujours l'écriture la plus récente de n'importe quel thread.volatilene garantit pas l'atomicité. Pour les actions composées (par exemple, les opérations d'incrémentation), envisagez d'utiliser d'autres mécanismes de synchronisation tels que les blocssynchronizedouAtomicInteger.volatilepeut entraîner des problèmes de performance. Ne l'utilisez que lorsque cela est nécessaire pour garantir la visibilité.volatileavec d'autres mécanismes de synchronisation pour garantir à la fois la visibilité et l'atomicité.volatilepermet d'éviter les erreurs de cohérence de la mémoire en établissant une relation "happens-before", garantissant que les modifications apportées à une variable volatile sont visibles par les autres threads.