732 votes

Jamais utiliser le mot clé volatile en Java ?

Dans le travail aujourd'hui, je suis tombé sur le `` mot clé en Java. N’étant ne pas très familier avec elle, j’ai trouvé cette explication : Java théorie et pratique : gérer la volatilité

Étant donné les détails dans lequel qu’article explique le mot clé en question, avez-vous jamais l’utiliser ou vous voyait jamais une affaire dans laquelle vous pouvez utiliser ce mot-clé de façon correcte ?

800voto

Greg Mattes Points 9578

volatile a la sémantique pour la mémoire de la visibilité. Fondamentalement, la valeur de l' volatile champ devient visible pour tous les lecteurs (les autres threads en particulier) après une opération d'écriture est terminée. Sans volatile, les lecteurs pourraient voir certains non-mise à jour de la valeur.

Pour répondre à votre question: Oui, j'utilise un volatile variable pour contrôler si certains le code continue à une boucle. La boucle de tests de l' volatile de la valeur et continue, si c'est true. La condition peut être réglé false en appelant à un "stop" de la méthode. La boucle voit false et se termine lors du test de la valeur après l'arrêt de la méthode de l'exécution terminée.

Le livre "Java Simultanéité dans la Pratique," que je recommande fortement, donne une bonne explication de l' volatile. Ce livre est écrit par la même personne qui a écrit le IBM article est référencé dans la question (en fait, il cite son livre en bas de cet article). Mon utilisation de l' volatile est ce que son article appelle le "modèle 1 indicateur d'état."

Si vous voulez en savoir plus sur la façon dont volatile fonctionne sous le capot, lire sur le modèle mémoire Java. Si vous voulez aller au-delà de ce niveau, découvrez une bonne architecture d'un ordinateur livre comme Hennessy Et Patterson et lire sur la cohérence de cache et le cache de la cohérence.

196voto

Ande Points 2787

"... le volatile modificateur de garanties que n'importe quel thread qui lit un champ voir les derniers écrits de la valeur". - Josh Bloch

Si vous envisagez d'utiliser volatile, lire sur le paquet java.util.concurrent qui traite atomique comportement.

La Wikipédia post sur un Pattern Singleton montre volatils dans l'utilisation.

60voto

Pyrolistical Points 12457

volatile est très utile pour arrêter des threads.

Non pas que vous devez écrire vos propres threads, Java 1.6 a beaucoup de pools de threads agréable. Mais si vous êtes sûr que vous avez besoin d’un thread, vous aurez besoin de savoir comment l’arrêter.

Le modèle que j’utilise des threads est :

Remarquez comment il n’est pas nécessaire pour la synchronisation

31voto

Dave L. Points 19623

Un exemple commun pour l'utilisation de volatile est d'utiliser un volatile boolean variable comme un drapeau pour mettre fin à un fil. Si vous avez commencé un fil, et que vous voulez être en mesure d'interrompre en toute sécurité à partir d'un autre thread, vous pouvez avoir le fil de vérifier régulièrement un drapeau. Pour arrêter, il suffit de mettre le drapeau de vrai. En faisant le drapeau volatile, vous pouvez vous assurer que le fil qui est de la vérification, il va voir qu'elle a été définie, la prochaine fois il le vérifie sans même avoir à utiliser un synchronized bloc.

14voto

ykaganovich Points 8497

Oui, volatile doit être utilisé quand vous voulez une variable mutable d’être accessible par plusieurs threads. Il n’est pas très commun usecase parce qu’en général, vous devrez effectuer plus d’une seule opération atomique (par exemple, vérifier l’état variable avant de le modifier), auquel cas vous utiliseriez un bloc synchronisé à la place.

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