Comment Volatile assure-t-il la visibilité?

Sous le processeur x86, utilisez l'outil pour obtenir les instructions d'assemblage générées par le compilateur JIT pour voir ce que fera le CPU lors de l'écriture de Volatile.

Code Java:

instance = new Singleton (); // instance est une variable volatile

Code d'assemblage:

0x01a3de1d: movb $ 0x0,0x1104800 (% esi);

0x01a3de24: verrou addl $ 0x0, (% esp);

Lors de l'écriture d'une variable partagée modifiée avec une variable volatile, il y aura une deuxième ligne de code d'assemblage . En vérifiant le manuel du développeur du logiciel d'architecture IA-32, nous pouvons voir que l' instruction de préfixe de verrouillage causera deux choses sous les processeurs multicœurs.

  • Les données de la ligne de cache actuelle du processeur seront réécrites dans la mémoire système.
  • Cette opération de réécriture dans la mémoire invalidera les données mises en cache à cette adresse mémoire dans d'autres CPU.

Afin d'améliorer la vitesse de traitement, le processeur ne communique pas directement avec la mémoire, mais lit d'abord les données de la mémoire système dans le cache interne (L1, L2 ou autre) avant d'effectuer l'opération, mais après l'opération, on ne sait pas quand elles seront écrites dans la mémoire Si une opération d'écriture est effectuée sur la variable volatile déclarée, la JVM enverra une instruction de préfixe de verrouillage au processeur pour écrire les données de la ligne de cache où la variable est située dans la mémoire système. Mais même si elle est réécrite dans la mémoire, si la valeur de cache des autres processeurs est encore ancienne, il y aura des problèmes lors des opérations de calcul. Par conséquent, afin de s'assurer que les caches de chaque processeur sont cohérents, le cache sera cohérent. Protocole, chaque processeur vérifie si la valeur de son cache a expiré en reniflant les données réparties sur le bus. Lorsque le processeur constate que l'adresse mémoire correspondant à sa ligne de cache a été modifiée, il modifiera la ligne de cache du processeur actuel Réglé sur un état invalide, lorsque le processeur souhaite modifier les données, il forcera à nouveau la lecture des données de la mémoire système vers le cache du processeur .

Compréhension de soi: variable partagée de l'instance dans la mémoire système. Lorsque plusieurs threads accèdent à cet objet simultanément, comme indiqué dans la figure, cpu1 accède à l'instance via threadA et cpu2 accède à l'instance via threadB. Afin d'améliorer la vitesse de traitement, le processeur ne communique pas directement avec la mémoire et Il s'agit d'abord de lire les données de la mémoire système dans le cache, puis d'effectuer l'opération.Si l'instance de variable est modifiée par le mot-clé volatile, cpu1 modifie les données d'instance dans le cache et les écrit immédiatement dans la mémoire système via le bus système, et d' autres processeurs la diffusent en reniflant le bus. Les données sont utilisées pour vérifier si la valeur de son propre cache a expiré. Lorsque le processeur constate que l’adresse mémoire correspondant à sa ligne de cache a été modifiée, il définit la ligne de cache du processeur actuel sur un état non valide, et lorsque le processeur souhaite modifier les données Quand, cela forcera à nouveau la lecture des données de la mémoire système vers le cache du processeur.

Je suppose que tu aimes

Origine blog.csdn.net/qianzhitu/article/details/103052040
conseillé
Classement