J'ai lu des articles sur le mot-clé volatile
mais je ne pouvais pas comprendre son utilisation correcte. Pourriez-vous me dire à quoi ça sert en C # et en Java?
Réponses
Trop de publicités?Considérons cet exemple:
int i = 5;
System.out.println(i);
Le compilateur peut optimiser ceci pour simplement imprimer 5, comme ceci:
System.out.println(5);
Cependant, s'il existe un autre thread susceptible de changer i, il s'agit d'un comportement incorrect. Si un autre thread change en i, la version optimisée affichera quand même 5.
Le mot clé volatile empêche cette optimisation et cette mise en cache. Il est donc utile lorsqu'une variable peut être modifiée par un autre thread.
Pour "C #" et pour Java, "volatile" indique au compilateur que la valeur d'une variable ne doit jamais être mise en cache car sa valeur peut changer en dehors de la portée du programme lui-même. Le compilateur évitera alors toute optimisation pouvant entraîner des problèmes si la variable change "en dehors de son contrôle".
Il est important de comprendre ce qui se passe quand la variable n'est pas volatile.
- Non volatile variable scénario:
Lorsque deux threads A Et B sont de l'accès à un non-volatile variable, chaque thread va conserver une copie locale de la variable dans son cache local. Tout changement fait par Un thread dans son cache local ne sera pas visible pour le fil B.
- Lorsque les variables sont déclarées volatile:
Il signifie essentiellement que les fils ne doivent pas mettre en cache ces une variable ou en d'autres termes ne devriez pas faire confiance les valeurs de ces variables, sauf s'ils sont directement lues à partir de la mémoire principale.
Donc,le moment de faire une variable volatile?
Lorsque vous avez une variable qui peut être consulté par de nombreux fils et vous voulez que chaque thread obtient la dernière mise à jour de la valeur de cette variable, même si elle est mise à jour par une autre thread/processus/à l'extérieur du programme.
Le mot-clé volatile a une signification différente en Java et en C#.
Java
À partir du Langage Java Spec :
Un champ peut être déclaré volatile, auquel cas la Java du modèle de mémoire garantit que tous les fils voir une cohérence de la valeur de la variable.
C#
À partir de la Référence C# sur le mot clé volatile:
Le mot clé volatile indique qu'un champ peut être modifié dans le programme, quelque chose comme le système d'exploitation, le matériel, ou simultanément à l'exécution du thread.
En Java, "volatile" est utilisé pour dire la JVM que la variable peut être utilisée par plusieurs threads en même temps, de sorte que certaines des optimisations courantes ne peuvent pas être appliquées.
Notamment la situation où les deux threads accèdent à la même variable sont en cours d'exécution sur des CPU dans la même machine. Il est très commun pour les CPU à la mémoire cache de façon agressive les données qu'il détient, car l'accès à la mémoire est beaucoup plus lent que l'accès au cache. Cela signifie que si les données sont mises à jour en CPU1 il doit immédiatement aller à travers tous les fichiers de cache et de la mémoire principale au lieu d'lorsque le cache décide de disparaître de lui-même, de sorte que CPU2 pouvez voir la valeur de mise à jour (encore une fois en laissant de côté tous les caches sur le chemin).