Volatile vs Statique en Java
Est-il correct de dire que static
signifie une copie de la valeur de tous les objets et volatile
signifie une copie de la valeur pour tous les threads?
De toute façon un static
valeur de la variable est également une valeur pour tous les threads, alors pourquoi devrions-nous aller pour volatile
?
- Explication officielle de la volatilité: cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile
Vous devez vous connecter pour publier un commentaire.
La déclaration d'une statique variable en Java, signifie qu'il n'y aura qu'un seul exemplaire, peu importe la façon dont beaucoup d'objets de la classe sont créés. La variable sera accessible même sans
Objects
créé à tous les. Cependant, les threads peuvent avoir mis en cache localement valeurs.Lorsqu'une variable est volatils et pas statique, il y aura une variable pour chaque
Object
. Ainsi, sur la surface, il semble qu'il n'y a pas de différence à partir d'une variable normale, mais totalement différent de statique. Cependant, même avecObject
champs, un thread peut mettre en cache la valeur d'une variable locale.Cela signifie que si deux threads mise à jour d'une variable du même Objet simultanément et de la variable n'est pas déclarée volatile, il pourrait y avoir des cas dans lesquels l'un des thread en cache une ancienne valeur.
Même si vous avez accès à un statique valeur par le biais de plusieurs threads, chaque thread peut avoir sa copie locale mise en cache! Pour éviter cela, vous pouvez déclarer la variable comme statique volatils et cela va forcer le fil à lire à chaque fois que la valeur globale.
Cependant, volatils n'est pas un substitut à une bonne synchronisation!
Par exemple:
L'exécution de
concurrentMethodWrong
simultanément de nombreuses fois peut conduire à une valeur finale du compteur différent de zéro!Pour résoudre le problème, vous devez mettre en œuvre une serrure:
Ou utiliser le
AtomicInteger
classe.Différence Entre la Statique et de la Volatilité :
Variable statique: Si deux Threads(à supposer que
t1
ett2
) ont accès à la même objet et la mise à jour d'une variable qui est déclarée comme statique alors cela signifiet1
ett2
peuvent faire leur propre copie locale d'un même objet(y compris les variables statiques) dans le cache, mettre à jour faite part1
à une variable statique dans son cache local coutume de tenir compte, dans la variable statique pourt2
cache .Variables statiques sont utilisés dans le contexte de l'Objet où la mise à jour effectuée par un objet de refléter de tous les autres objets de la même classe mais pas dans le contexte du Thread où la mise à jour d'un thread à la variable statique reflètent les modifications immédiatement à tous les threads (dans leur cache local).
Volatils variable: Si deux Threads(à supposer que
t1
ett2
) ont accès à la même objet et la mise à jour d'une variable qui est déclarée comme volatile, alors cela signifiet1
ett2
peuvent faire leur propre cache local de l'Objet à l'exception de la variable qui est déclarée comme un volatile . Donc la volatilité de la variable aura qu'un seul exemplaire, qui sera mis à jour par différents threads et de la mise à jour effectuée par un seul thread à la volatilité des variables reflètent immédiatement à l'autre Thread.volatile
variable peut être partagé entre des caches CPU. Cela ne présente aucun problème, car le cache négocie la propriété exclusive de la ligne de cache avant de le modifier.En plus d'autres réponses, je voudrais ajouter une image pour qu'elle(pic rend facile à comprendre)
static
variables peuvent être mises en cache pour les threads individuels. En multithread environnement si un thread modifie en cache de données, qui peuvent ne pas refléter pour les autres threads qu'ils ont une copie d'elle.volatile
déclaration permet de s'assurer que les fils de ne pas mettre en cache les données et utilise la copie partagée seulement.source de l'image
Je pense que
static
etvolatile
n'ont pas de relation du tout. Je vous suggère de lire java tutoriel pour comprendre Accès Atomique, et pourquoi utiliser atomique d'accès, de comprendre ce qu'est interleaved, vous trouverez la réponse.En termes simples,
statique :
static
variables sont associées avec le classe, plutôt qu'avec n'importe quel objet. Chaque instance de la classe d'actions d'une variable de classe, qui est dans un emplacement fixe dans la mémoirevolatile: Ce mot-clé est applicable à la fois classe et instance variables.
Jetez un oeil à cette l'article par
Javin Paul
à comprendre variables dans une meilleure façon.En l'absence de
volatile
mot-clé, la valeur de la variable dans chaque pile du thread peut être différent. En faisant de la variable commevolatile
, tous les threads de même valeur dans leur mémoire de travail et mémoire de la cohérence des erreurs ont été évités.Ici, le terme de
variable
peut êtrestatic
(classe) de la variable ouinstance
(objet) de la variable.Au sujet de votre requête :
Si j'ai besoin d'
instance
variable dans mon application, je ne peux pas utiliserstatic
variable. Même en cas destatic
variable, la cohérence n'est pas garanti en raison de Fil de cache comme indiqué dans le diagramme.À l'aide de
volatile
variables réduit le risque de consistance de la mémoire des erreurs, car tout écrire dans une variable volatile établit un passe-avant la relation avec les lectures suivantes de cette même variable. Cela signifie que la modification d'une variable volatile sont toujours visibles par les autres threads.À l'aide de simple variable atomique accès est plus efficace que l'accès à ces variables par synchronisé code
Certaines des classes dans le
java.util.concurrent
paquet de fournir atomique méthodes qui ne reposent pas sur la synchronisation.Reportez-vous à cette haut niveau de contrôle de la simultanéité article pour plus de détails.
En particulier, ont un oeil à Atomique variables.
Liées SE questions:
Volatile Vs Atomique
Volatile boolean vs AtomicBoolean
La différence entre la volatilité et la synchronisation en Java
volatile
plus tôt, mais, cette réponse clarifie beaucoup de choses pour moi, pourquoi suis-je encore besoin d'utiliservolatile
avec lestatic
variable.volatils valeur de la variable d'accès direct à partir de la mémoire principale. Il doit être utilisé uniquement en multi-threading de l'environnement.
statique de la variable sera chargée une seule fois. Si utilisé dans un seul thread de l'environnement, même si la copie de la variable sera mis à jour et il n'y aura pas de nuire à l'accès puisqu'il n'y a qu'un seul thread.
Maintenant, si une variable statique est utilisé dans le multi-threading de l'environnement, puis il y aura des problèmes si l'on s'attend à ce résultat voulu d'elle. Comme chaque thread possède sa propre copie alors tout d'incrémentation ou de décrémentation sur la variable statique à partir d'un fil peut ne pas refléter, dans un autre thread.
si on s'attend à des résultats souhaités à partir d'une variable statique puis utilisez volatile de l'électricité statique dans le multi-threading, alors tout sera résolu.
Pas sûr des variables statiques sont mis en cache dans le fil de la mémoire locale ou PAS. Mais quand j'ai exécuté deux threads(T1,T2) d'accéder à un même objet(obj) et lors de la mise à jour effectuée par T1 fil de variable statique il a obtenu reflète dans T2.
Si nous déclarons une variable statique, il n'y aura qu'une copie de la variable.
Donc, chaque fois que les différents threads d'accéder à cette variable, il n'y aura qu'une valeur finale de la variable(car il y a un seul emplacement de mémoire allouée pour la variable).
Si une variable est déclarée comme volatile, tous les threads ont leur propre copie de la variable, mais la valeur est prise à partir de la mémoire principale.Donc, la valeur de la variable dans tous les threads seront les mêmes.
Donc, dans les deux cas, le point principal est que la valeur de la variable est identique sur tous les threads.