Que sont les modificateurs transitoires et volatils?

126

Quelqu'un peut-il expliquer ce transientque volatilesignifient les modificateurs et en Java?

Vijay Bhaskar Semwal
la source
3
Ce n'était clairement pas une question et c'est un double de toute façon (c'est pourquoi j'ai voté pour la fermeture). Voir par exemple Pourquoi Java a-t-il des variables transitoires? et Quand utilisez-vous exactement le mot-clé volatile en Java? (et bien d'autres).
Pascal Thivent
duplicata possible de Pour ce qui est utilisé "volatile"?
Jeff
18
C'est une question parfaitement valide, équivalente à: stackoverflow.com/questions/215497/…
Barry Fruitman

Réponses:

156

Les modificateurs volatileet transientpeuvent être appliqués aux champs des classes 1 quel que soit le type de champ. En dehors de cela, ils ne sont pas liés.

Le transientmodificateur indique au sous-système de sérialisation d'objets Java d'exclure le champ lors de la sérialisation d'une instance de la classe. Lorsque l'objet est ensuite désérialisé, le champ sera initialisé à la valeur par défaut; c'est- nullà- dire pour un type de référence, et zéro ou falsepour un type primitif. Notez que le JLS (voir 8.3.1.3 ) ne dit pas ce que transientsignifie, mais s'en remet à la spécification de sérialisation d'objets Java . D'autres mécanismes de sérialisation peuvent prêter attention à transient-ness d' un champ . Ou ils peuvent l'ignorer.

(Notez que le JLS permet à un staticchamp d'être déclaré comme transient. Cette combinaison n'a pas de sens pour la sérialisation d'objets Java, car elle ne sérialise pas de toute façon la statique. Cependant, cela pourrait avoir un sens dans d'autres contextes, donc il y a une justification pour pas l'interdire carrément.)

Le volatilemodificateur indique à la machine virtuelle Java que les écritures dans le champ doivent toujours être vidées de manière synchrone dans la mémoire et que les lectures du champ doivent toujours être lues à partir de la mémoire. Cela signifie que les champs marqués comme volatils peuvent être accédés et mis à jour en toute sécurité dans une application multi-thread sans utiliser la synchronisation native ou standard basée sur une bibliothèque. De même, les lectures et les écritures dans les champs volatils sont atomiques. (Ceci ne s'applique pas aux champs >> non volatiles << longou aux doublechamps, qui peuvent être soumis à un «déchirement de mots» sur certaines JVM.) Les parties pertinentes du JLS sont 8.3.1.4 , 17.4 et 17.7 .


1 - Mais pas aux variables ou paramètres locaux.

Stephen C
la source
10

volatileet transientmots - clés

1) Le transientmot clé est utilisé avec les variables d'instance pour les exclure du processus de sérialisation. Si un champ est, transientsa valeur ne sera pas conservée.

D'autre part, le volatilemot-clé est utilisé pour marquer une variable Java comme "stockée dans la mémoire principale".

Chaque lecture d'une volatilevariable sera lue depuis la mémoire principale de l'ordinateur, et non depuis le cache du processeur, et chaque écriture dans une volatilevariable sera écrite dans la mémoire principale, et pas seulement dans le cache du processeur.

2) Le transientmot-clé ne peut pas être utilisé avec le staticmot-clé mais volatilepeut être utilisé avec static.

3) les transientvariables sont initialisées avec la valeur par défaut lors de la désérialisation et l'affectation ou la restauration de la valeur doit être gérée par le code d'application.

Pour plus d'informations, consultez mon blog:
http://javaexplorer03.blogspot.in/2015/07/difference-between-volatile-and.html

Rajesh Dixit
la source
2
La raison pour laquelle la transientvariable ne peut pas être utilisée avec le staticmot-clé est que les variables statiques appartiennent à une classe et non à une instance individuelle. Le concept de sérialisation concerne l'état actuel de l'objet. Seules les données associées à une instance spécifique d'une classe sont sérialisées, par conséquent les champs de membres statiques sont ignorés lors de la sérialisation
Chaklader Asfak Arefe
En fait, le JLS permet staticet transientpeut être utilisé ensemble. Le problème est que cela n'a pas de sens, car les mécanismes de sérialisation typiques ne persistent pas de toute façon statiques.
Stephen C
7

Volatile signifie que d'autres threads peuvent modifier cette variable particulière. Ainsi, le compilateur permet d'y accéder.

http://www.javamex.com/tutorials/synchronization_volatile.shtml

Transient signifie que lorsque vous sérialisez un objet, il renverra sa valeur par défaut lors de la désérialisation

http://www.geekinterview.com/question_details/2

Raynos
la source
5
"Donc le compilateur autorise l'accès à eux." Votre phrase suggère que les threads n'y ont pas accès par défaut. Maintenant, j'ai lu le lien et l'autre réponse que je comprends: le compilateur ne fait aucun type de stockage intermédiaire spécifique au thread de la variable afin que les autres threads puissent voir les changements immédiatement.
helios
J'ai eu l'utilisation de C de volatile et l'utilisation de Java de volatile confused. Je voulais dire que le compilateur s'assure qu'il a accès à la valeur actaul du champ plutôt qu'à une valeur mise en cache.
Raynos
cela signifie plus que cela.
Stephen C
1

Transitoire:

Premièrement, il faut savoir où il en a besoin, comment combler le fossé.

1) Un transitoire de modificateur d'accès n'est applicable qu'au composant variable uniquement. Il ne sera pas utilisé avec la méthode ou la classe.

2) Le mot clé transitoire ne peut pas être utilisé avec le mot clé statique.

3) Qu'est-ce que la sérialisation et où est-elle utilisée? La sérialisation est le processus qui rend l'état de l'objet persistant. Cela signifie que l'état de l'objet est converti en un flux d'octets à utiliser pour la persistance (par exemple le stockage des octets dans un fichier) ou le transfert (par exemple l'envoi d'octets sur un réseau). De la même manière, nous pouvons utiliser la désérialisation pour ramener l'état de l'objet à partir d'octets. C'est l'un des concepts importants de la programmation Java car la sérialisation est principalement utilisée dans la programmation réseau. Les objets qui doivent être transmis via le réseau doivent être convertis en octets. Avant de comprendre le mot-clé transitoire, il faut comprendre le concept de sérialisation. Si le lecteur connaît la sérialisation, veuillez ignorer le premier point.

Note 1) Le transitoire est principalement utilisé pour le processus de sérialisation. Pour cela, la classe doit implémenter l'interface java.io.Serializable. Tous les champs de la classe doivent être sérialisables. Si un champ n'est pas sérialisable, il doit être marqué comme transitoire.

Note 2) Lorsqu'un processus désérialisé a lieu, il est défini sur la valeur par défaut - zéro, faux ou nul selon la contrainte de type.

Note 3) Mot-clé transitoire et son objectif? Un champ qui est déclaré avec un modificateur transitoire ne participera pas au processus sérialisé. Lorsqu'un objet est sérialisé (enregistré dans n'importe quel état), les valeurs de ses champs transitoires sont ignorées dans la représentation en série, tandis que le champ autre que les champs transitoires participe au processus de sérialisation. C'est l'objectif principal du mot clé transitoire.

Vishal Sheth
la source