Visibilité, trois faces

Programmeur Sasha 2021-08-19 23:41:05 阅读数:202

visibilit trois faces

Le problème avec ce cache incohérent ci - dessus,Prenons note d'abord.,Continue de regarder.JavaModèle de mémoire,En fait...JavaLe modèle de mémoire décrit ci - dessus la relation entre le cache du système informatique et la mémoire est similaire.

JavaLe modèle de mémoire décrit,Règles d'accès pour les différentes variables,Et ce détail sous - jacent qui stocke les variables en mémoire et les lit.

InJavaLes variables concernées dans le modèle mémoire sont toutes des variables partagées(Variables d'instance、Variables de classe).
Toutes les variables partagées sont stockées dansMémoire principaleDans,Mais chaque thread accède à la variable dans sa propreMémoire de travailCache du processeur)Conserver une copie des variables partagées.

JavaModèle de mémoire(Java Memory Model,AbréviationsJMM)Le règlement:

Toutes les actions du thread sur la variable(Lire,Écris.)Doit être en mémoire de travail,Impossible d'utiliser les données directement dans la mémoire principale.
Entre les différents fils Il n'y a pas non plus d'accès direct aux variables de la mémoire de travail de l'autre partie,Le transfert de valeur variable entre les Threads doit se faire par transfert de mémoire primaire.
InJMMLa relation entre la mémoire de travail et la mémoire principale est la suivante:

VolatileLa visibilité de(Garantie de visibilité immédiate)

Continuez avec le problème de cohérence du cache ci - dessus,Cette question,InJavaDans le modèle de mémoire,C'est la question de la visibilité,C'est - à - dire qu'un thread modifie la valeur d'une variable partagée,Est - ce immédiatement visible pour un autre thread. Si ce n'est pas immédiatement visible ,Il y a un problème de cohérence du cache, Si immédiatement visible ,Alors l'autre thread, en cours d'opération,La valeur de la variable obtenue est la plus récente.Pour résoudre le problème de la visibilité.

Comment résoudre le problème de visibilité?

  • Programme I:Verrouillage

Verrouiller les variables partagées ,Que ce soitsynchronizedToujoursLockTout va bien.,Le but du verrouillage est qu'un seul thread peut fonctionner sur des variables partagées en même temps,C'est - à - dire,Après avoir lu les variables partagées de la mémoire de travail à la mise à jour des valeurs,Lors de la synchronisation du retour à la mémoire principale,D'autres Threads ne peuvent pas manipuler cette variable.Cela résout naturellement le problème de la visibilité,Mais c'est moins efficace,Les Threads qui ne peuvent pas manipuler les variables partagées ne peuvent que bloquer.

  • Programme II:volatile Modifier les variables partagées

Lorsqu'une variable partagée est volatileAprès modification,Assurez - vous que chaque thread synchronise immédiatement les valeurs modifiées de la variable dans la mémoire principale,La dernière valeur de la variable est lue lorsque d'autres Threads ont besoin de lire la variable.

AlorsvolatileQue fait - on pour résoudre le problème de la visibilité??

ParvolatileVariables modifiées, Lorsqu'il est manipulé par un thread , Il y aura un tel mécanisme :

  • 1.

C'est - à - dire que le thread lit de la mémoire principale à sa propre mémoire de travail lorsqu'il agit sur une variable,Quand le thread a modifié la variable,Une copie de la variable dans un autre thread qui a lu cette variable échouera,De cette façon, d'autres Threads utilisent des variables, Trouvé invalide ,Alors va dans la mémoire principale et récupère,De cette façon, seules les valeurs les plus récentes sont obtenues.

AlorsvolatileComment ce mot - clé implémente - t - il ce mécanisme?

Parce qu'il y a plus d'un ordinateurCPU, Même variable ,Dans plusieursCPULes valeurs mises en cache dans peuvent être différentes,Alors, à qui la valeur mise en cache a - t - elle priorité?

Puisque tout le monde a sa propre valeur, , Alors, chacun CPU Il y a un accord. ,Pour s'assurer que certaines règles prévalent,Pour déterminer la valeur exacte de la variable partagée, Comme ça. CPUSuivez le Protocole lors de la lecture et de l'écriture des variables partagées.

C'est le Protocole de cohérence du cache .

Le Protocole de cohérence de cache le plus connu estIntelDeMESIC'est,Dis - le.MESIHeure, Explique - moi d'abord. , Lignes de cache :

Lignes de cache (cache line):CPUL'Unit é de stockage minimale qui peut être allouée dans le cache,Les variables dans le cache sont toutes présentes dans la ligne cache.

MESI L'idée centrale de ,QuandCPUTrouvé lors de l'écriture d'une variable, Les variables sont partagées , Alors vous en informerez les autres. CPUDéfinissez la ligne de cache de cette variable à un état invalide. Quand les autres CPULa variable a été trouvée invalide dans la ligne cache lors de l'opération,Alors va dans la mémoire principale et relis la dernière variable.

  • Alors les autres CPUComment trouver les variables modifiées?

Parce queCPULa communication avec d'autres composants se fait par bus,Donc chaqueCPUDiffuser les données en reniflant le bus,Pour vérifier si les valeurs mises en cache sont périmées,Lorsque le processeur découvre que l'adresse mémoire correspondant à la ligne de remplacement a été modifiée,Définit les lignes de cache dans votre mémoire de travail à un état non désiré,QuandCPULes modifications apportées à cette variable reliront la variable de la mémoire principale du système.

Volatile Ordre de (Désactiver le réarrangement des commandes)

En général, Quand nous avons écrit le programme, ,Il faut écrire le premier Code de haut en bas,Par défaut, le programme est considéré comme exécuté dans l'ordre descendant,MaisCPU Pour une plus grande efficacité ,Tout en garantissant l'exactitude du résultat final,Est de réorganiser les instructions.C'est - à - dire que le code écrit avant n'est pas nécessairement exécuté en premier,Il n'est pas nécessairement trop tard pour les autres.

Par exemple,:

int a = 5; // Code1
int b = 8; // Code2
a = a + 4; // Code3
int c = a + b; // Code4

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

L'ordre d'exécution des quatre lignes de code ci - dessus pourrait être

JMMAutoriser le réarrangement des instructions,Sous réserve que le résultat final soit correct, Le processeur peut jouer , Amélioration de l'efficacité de la mise en œuvre .

Le réarrangement est encore plus important lorsque plusieurs Threads exécutent le Code,DiversCPU Pour être plus efficace , Risque de concurrence ,Cela pourrait conduire à une mise en œuvre correcte.

Donc pour assurer l'exactitude de l'exécution finale sous plusieurs Threads, Utiliser des variables volatileModifier,Ceci a pour effet d'interdire le réarrangement des instructions( En fait, on peut aussi le verrouiller. ,Il existe d'autres règles connues pour empêcher le réarrangement des instructions, Mais nous n'en parlons que ici. volatileMise en œuvre).

AlorsvolatileComment mettre en œuvre le réarrangement des instructions?

La réponse est::Barrière de mémoire

Barrière de mémoire C'est un groupe. CPUDirectives,Utilisé pour limiter l'ordre des opérations de mémoire.
JavaCompilateur, Lorsque la famille d'instructions est générée ,Une barrière de mémoire est insérée au bon endroit pour empêcher le processeur de réorganiser les instructions.

volatileDeux barrières de mémoire sont ajoutées avant et après l'écriture de la variable,Pour s'assurer que les instructions d'écriture précédentes et les instructions de lecture suivantes sont ordonnées.

volatileInsérer deux instructions après l'opération de lecture de la variable,Interdire le réarrangement des instructions de lecture et d'écriture suivantes.

Ordre, Pas seulement volatileC'est garanti,D'autres moyens de mise en œuvre peuvent également garantir,Mais si chaque implémentation doit être comprise, c'est plus difficile pour les développeurs.

Donc deJDK5Et voilà.happen-beforePrincipes, Aussi connu sous le nom de principe du premier arrivé .
Le principe du premier arrivé se résume à: Si une action AL'effet produit par une autre opération peut êtreBObservations,Alors on peut dire,Cette opérationA Événement et fonctionnement antérieurs B.

Les effets mentionnés ici incluent la modification des variables en mémoire, Méthode appelée , Envoyer des messages de quantité, etc. .

<mark style=“margin: 0px; padding: 0.2em; box-sizing: border-box; background: rgb(252, 248, 227); color: rgb(0, 0, 0);”>volatile Le principe de l'occurrence anticipée est le suivant: ,Oui, un.volatile Écrire des variables ,L'opération de lecture de cette variable se produit n'importe où par la suite.</mark>

Volatile L'atomicité n'est pas garantie

Atomicité,C'est - à - dire qu'une opération est réussie ou qu'elle l'est, Ou ils échouent tous. , Est indépendant et complet .

Comme ça. ,Si plusieurs Threads accumulent une variable,Donc certainement pas le résultat souhaité,Parce que l'accumulation n'est pas une opération atomique.

Pour s'assurer que le résultat final de l'accumulation est correct, Ou verrouiller la variable d'accumulation , C'est bon. AotomicInteger Ces variables .

/**
* Double inspection et verrouillage d'un seul cas
### Alors comment maîtriser correctementRedisEt alors??
Pour que tout le monde puisseRedisPeut approfondir,Donc cette fois, j'ai préparé quelque chose pour tout le mondeRedisMatériel d'apprentissage pour,Et quelques questions d'entrevue pour les grandes usines,Inclure les questions d'entrevue suivantes
* Résumé des questions d'entrevue sur la programmation simultanée
* JVMRésumé des questions d'entrevue
* NettyUn résumé des questions d'entrevue fréquemment posées
* TomcatRésumé des questions d'entrevue
* MysqlRésumé des questions d'entrevue
* SpringAnalyse approfondie du code source
* MybatisRésumé des questions d'entrevue courantes
* NginxUn résumé de ces questions d'entrevue
* ZookeeperRésumé des questions d'entrevue
* RabbitMQRésumé des questions d'entrevue courantes
JVMEntretien fréquent:
![RedisNotes d'entrevue à haute fréquence:Base+Cache l'avalanche+Sentinelle+Cluster+ReidsConception de scénarios](https://s2.51cto.com/images/20210819/1629387066205361.jpg)
MysqlRésumé des questions d'entrevue(Un.)
![RedisNotes d'entrevue à haute fréquence:Base+Cache l'avalanche+Sentinelle+Cluster+ReidsConception de scénarios](https://s2.51cto.com/images/20210819/1629387067894291.jpg)
MysqlRésumé des questions d'entrevue(2.)
![RedisNotes d'entrevue à haute fréquence:Base+Cache l'avalanche+Sentinelle+Cluster+ReidsConception de scénarios](https://s2.51cto.com/images/20210819/1629387067528398.jpg)
RedisRésumé des questions d'entrevue courantes(300+Questions)
![RedisNotes d'entrevue à haute fréquence:Base+Cache l'avalanche+Sentinelle+Cluster+ReidsConception de scénarios](https://s2.51cto.com/images/20210819/1629387068632495.jpg)
**Amis dans le besoin,C'est bon.[Cliquez ici pour obtenir gratuitement](https://gitee.com/vip204888/java-p7)**
Pas de routine!!
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
Copyright:Cet article est[Programmeur Sasha]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2021/08/20210819234023698A.html