En termes simples,
statique : les static
variables sont associées à la classe , plutôt qu'à n'importe quel objet . Chaque instance de la classe partage une variable de classe, qui se trouve dans un emplacement fixe en mémoire
volatile : ce mot-clé s'applique aux variables de classe et d' instance .
L'utilisation de variables volatiles réduit le risque d'erreurs de cohérence de la mémoire, car toute écriture dans une variable volatile établit une relation passe-avant avec les lectures suivantes de cette même variable. Cela signifie que les modifications apportées à une variable volatile sont toujours visibles pour les autres threads
Jetez un oeil à cet article par Javin Paul
comprendre les variables volatiles d'une manière mieux.
En l'absence de volatile
mot-clé, la valeur de la variable dans la pile de chaque thread peut être différente. En créant la variable as volatile
, tous les threads obtiendront la même valeur dans leur mémoire de travail et les erreurs de cohérence de la mémoire ont été évitées.
Ici, le terme variable
peut être une static
variable (classe) ou une variable instance
(objet).
Concernant votre requête:
Quoi qu'il en soit, une valeur de variable statique va également être une valeur pour tous les threads, alors pourquoi devrions-nous opter pour volatile?
Si j'ai besoin de instance
variable dans mon application, je ne peux pas utiliser de static
variable. Même en cas de static
variable, la cohérence n'est pas garantie en raison du cache de thread comme indiqué dans le diagramme.
L'utilisation de volatile
variables réduit le risque d'erreurs de cohérence de la mémoire, car toute écriture dans une variable volatile établit une relation passe-avant avec les lectures suivantes de cette même variable. Cela signifie que les modifications apportées à une variable volatile sont toujours visibles pour les autres threads.
De plus, cela signifie également que lorsqu'un thread lit une variable volatile, il voit non seulement la dernière modification apportée à la volatile, mais également les effets secondaires du code qui a provoqué la modification => des erreurs de cohérence de la mémoire sont toujours possibles avec des variables volatiles . Pour éviter les effets secondaires, vous devez utiliser des variables synchronisées. Mais il existe une meilleure solution en java.
L'utilisation d'un accès aux variables atomiques simple est plus efficace que l'accès à ces variables via un code synchronisé
Certaines classes du java.util.concurrent
package fournissent des méthodes atomiques qui ne dépendent pas de la synchronisation.
Reportez-vous à cet article de contrôle de concurrence de haut niveau pour plus de détails.
Jetez un œil aux variables atomiques .
Questions SE connexes:
Volatile contre atomique
Volatile booléen vs AtomicBoolean
Différence entre volatile et synchronisé en Java