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..