280 votes

Volatile Vs Statique en java

Est-il correct de dire que statique 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 statique de la valeur de la variable est également une valeur pour tous les threads, alors pourquoi devrions-nous aller pour les volatiles?

384voto

stivlo Points 28997

La déclaration d'une statique de la 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 les Objets créés. Cependant, les threads peuvent avoir mis en cache localement des valeurs.

Lorsqu'une variable est volatile et non pas statique, il y a une variable pour chaque Objet. Ainsi, sur la surface, il semble qu'il n'y a pas de différence à partir d'une variable normale, mais totalement différente de la statique. Cependant, même avec les champs Objet, 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 de la valeur à travers plusieurs threads, chaque thread peut avoir sa copie locale mise en cache! Pour éviter cela, vous pouvez déclarer la variable comme statique volatile et cela va forcer le fil à lire à chaque fois que la valeur globale.

Toutefois, la volatilité n'est pas un substitut à une bonne synchronisation! Par exemple:

    private static volatile int counter = 0;

    private void concurrentMethodWrong() {
         counter = counter + 5;
         //do something
         counter = counter - 5;
    }

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 un verrou:

    private static final Object counterLock = new Object();

    private static volatile int counter = 0;

    private void concurrentMethodRight() {
         synchronized (counterLock) {
             counter = counter + 5;
         }
         //do something
         synchronized (counterLock) {
             counter = counter - 5;
         }
    }

Ou utiliser l' AtomicInteger classe.

294voto

Som Points 1408

Différence Entre la Statique et de la Volatilité :

Variable statique: Si deux Threads(supposons t1 et t2) ont accès à la même objet et la mise à jour d'une variable qui est déclarée comme statique alors t1 et t2 peuvent faire leur propre copie locale d'un même objet(y compris les variables statiques) dans le cache, mettre à jour faite par t1 pour la variable statique dans son cache local coutume de tenir compte, dans la variable statique pour t2 cache .

Les 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).

Volatilité variable: Si deux Threads(supposons t1 et t2) ont accès à la même objet et la mise à jour d'une variable qui est déclarée comme volatile, cela signifie que l' t1 et t2 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.

Donc la volatilité de la variable est utilisée dans le contexte du Thread .

5voto

user2245634 Points 483

je pense que la statique et de la volatilité n'ont pas de relation du tout.je vous suggère de lire java tutoriel pour comprendre Atomique d'Accès,et pourquoi utiliser atomique accès,de comprendre ce qui est entrelacé,vous trouverez la réponse.

-1voto

Vlatko Dimov Points 1

La déclaration d'une variable volatile garanties que sur les différentes architectures de la jvm ne va pas cache que variable fil localement

-2voto

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X