Je suis conscient que le but des variables volatiles dans Java est que les écritures à de telles variables sont immédiatement visibles aux autres threads. Je suis également conscient que l'un des effets d'un bloc synchronisé est de vider la mémoire locale du thread dans la mémoire globale.Que signifie le rinçage de la mémoire locale dans la mémoire globale?
Je n'ai jamais entièrement compris les références à la mémoire 'thread-local' dans ce contexte. Je comprends que les données qui existent seulement sur la pile sont locales, mais quand on parle d'objets sur le tas, ma compréhension devient floue.
J'espérais que pour obtenir des commentaires sur les points suivants:
Lors de l'exécution sur une machine avec plusieurs processeurs, ne chasse la mémoire de thread local faisant simplement référence au rinçage du cache du processeur dans la RAM? Lors de l'exécution sur un ordinateur monoprocesseur, cela signifie-t-il quelque chose?
S'il est possible que le tas possède la même variable à deux emplacements de mémoire différents (chacun étant accédé par un thread différent), dans quelles circonstances cela se produirait-il? Quelles implications cela a-t-il sur la collecte des ordures? Avec quelle agressivité les machines virtuelles font-elles ce genre de chose?
(EDIT: ajout de la question 4) Quelles données sont vidées lors de la sortie d'un bloc synchronisé? Est-ce tout ce que le thread a localement? Est-ce seulement les écritures qui ont été faites à l'intérieur du bloc synchronisé?
Object x = goGetXFromHeap(); // x.f is 1 here Object y = goGetYFromHeap(); // y.f is 11 here Object z = goGetZFromHead(); // z.f is 111 here y.f = 12; synchronized(x) { x.f = 2; z.f = 112; } // will only x be flushed on exit of the block? // will the update to y get flushed? // will the update to z get flushed?
Dans l'ensemble, je pense que je essaie de comprendre si des moyens de fil locale mémoire qui est physiquement accessible par une seule unité centrale de traitement ou en cas de partage de tas de fil local logique fait par la machine virtuelle? Tous les liens vers des présentations ou de la documentation seraient extrêmement utiles.
J'ai passé du temps à faire des recherches sur ce sujet, et même si j'ai trouvé beaucoup de littérature intéressante, je n'ai pas été en mesure de satisfaire ma curiosité concernant les différentes définitions de la mémoire locale du fil.
Merci beaucoup.
Merci pour les commentaires. Je suis en fait familier avec l'analyse d'échappement et cela a commencé ma confusion avec «thread-local». Je voudrais poser deux questions de suivi s'il vous plaît: 1. Si le compilateur a prouvé qu'un objet est thread-local, et que l'objet existe dans une région thread-locale du tas, pourquoi écrire dans cet objet à l'intérieur un bloc synchronisé doit être vidé? Le vidage du cache du processeur à la région du tas local-thread ne serait jamais observable par le thread qui a fait l'écriture? Est-ce que cela implique que les threads commutent les processeurs et commencent à s'exécuter avec un cache CPU différent? –
2. Est-il possible qu'une JVM ait un objet existant simultanément dans deux emplacements de mémoire distincts sur le tas? Si oui, dans quelles circonstances cela se produirait-il? –
1. Un 'synchronized' implique un flush de" tout ". Le 'synchronized' a un paramètre qui est l'instance sur laquelle le verrou est pris, mais le modèle de mémoire de Java exige que toute la vue de mémoire du fil soit soumise à la barrière de mémoire. Maintenant, si la JVM peut prouver qu'elle n'a pas besoin de vider un objet car aucun autre thread ne peut le voir (et que les objets non échappés sont de bons candidats), la JVM est libre de ne pas vider, selon la règle "as" peut faire tout ce qu'il souhaite tant que le résultat ne peut pas être distingué de la machine abstraite Java). –