Quand utiliser volatile vs synchronisation en multithread dans Java?
Quand utiliser le mot clé volatile vs synchronisation dans le multithreading?
source d'informationauteur Jyotirup | 2012-01-02
Vous devez vous connecter pour publier un commentaire.
Utilisation
volatile
garantir que chaque accès en lecture à une variable de voir la dernière valeur écrite dans cette variable. Utilisationsynchronized
chaque fois que vous avez besoin de valeurs stables pour des instructions multiples. (Notez que cela ne signifie pas nécessairement que plusieurs déclarations; la seule déclaration:est pas thread-safe, même si
var
est déclarévolatile
. Vous devez pour ce faire:Voir ici pour un bon résumé de ce problème.
Volatils assure l'opération de lecture, qui donne toujours le dernier état de la mémoire dans les threads. Toutefois, elle ne garantit pas de tout écrire à la sécurité /les commandes des opérations, c'est à dire deux threads peuvent mettre à jour la volatilité de la variable dans n'importe quel ordre. Aussi il ne pas de s'assurer que plusieurs opérations sur la variable sont atomiques.
Toutefois un bloc synchronisé assure la plus récente de l'état et de l'écriture de la sécurité. Aussi l'accès et la mise à jour de la variable est atomique à l'intérieur d'un bloc synchronisé.
Ci-dessus, en revanche, est vrai, seulement si tous les accès /mises à jour de la variable en question sont à l'aide de la même serrure objet, de telle sorte qu'à aucun moment plusieurs threads obtient l'accès à la variable.
Qui est une très vaste question. La meilleure réponse que je puisse vous donner est d'utiliser
synchronized
lors de l'exécution de plusieurs actions qui doit être vu par d'autres threads comme se produisant atomiquement tous ou aucun des étapes ont eu lieu.Pour une seule action,
volatile
peut être suffisant; il agit comme une barrière de mémoire pour assurer la visibilité du changement pour les autres threads.Volatile ne pas acquérir un verrou, il utilise le sous-jacent de l'architecture CPU à assurer visibilité à travers tous les threads après l'écriture.