Ai-je besoin de volatiles pour les variables de types de référence également?

Nous utilisons souvent volatile pour nous assurer qu’une variable de condition est visible pour chaque thread.

Je vois que les champs volatile sont tous de primitive type dans le code jusqu’à présent.

Le champ object a-t-il ce problème? Par exemple:

 class a { public Ssortingng str; public List list; } 

Si certains threads accèdent à str et list, dois-je append ‘volatile’?

Je suppose que chaque access à Object sera directement issu de Heap , et que l’ Object ne sera pas mis en cache comme type primitif.

Est-ce correct?

Vous devez faire la distinction entre la référence d’object et l’object réel.

  • Pour la référence, votre modificateur de champ est pertinent. Lorsque vous modifiez la référence à un object différent (c.-à-d. Référence à une chaîne différente), le changement peut ne pas être remarqué par un autre thread. Si vous souhaitez renforcer la visibilité, vous devez utiliser final ou volatile .

  • L’ object réel sur le tas n’est pas affecté par le modificateur de champ. La façon dont vous voyez que chaque champ de cet object est déterminé par son propre modificateur de champ selon les mêmes règles (est-il volatile ou final ? Dans le cas contraire, la visibilité des threads concurrents n’est pas forcée).

Donc, la réponse est: oui, vous devez append volatile ou final . Sur le plan stylistique, il serait toutefois préférable de se rendre en finale. Il a le même effet sur les threads, mais constitue également une déclaration plus forte: ce champ ne peut pas être modifié – c’est la raison pour laquelle il peut être mis en cache sans se soucier par la JVM. Et pour la même raison, Java présente peu d’avantages sur le plan des performances par rapport à la volatile , Java n’a pas à se soucier de savoir si le champ est modifié à nouveau et n’a pas besoin d’append de temps système.

Vous ajoutez un volatile keyword pour indiquer au compilateur que sa change liée. de sorte que tous les fils

confirmer à nouveau que leur local cached copy est identique à celle d’origine, s’il y a des modifications

le met à jour et vous le trouvez généralement avec des primitives parce que généralement les valeurs primitives sont incrémentées

ou décrémenté etc par différents threads. mais Object, en particulier List ne changera jamais car il est juste

une référence à l’object. si vous affectez différents objects à la même variable, au moment de l’exécution

alors vous pouvez

faire..