Existe-t-il une différence entre une référence d'objet volatile
et AtomicReference
dans le cas où j'utiliserais seulement get()
et set()
méthodes de AtomicReference
?
Réponses
Trop de publicités?Bref, la réponse est: Non.
De la java.util.de façon concomitante.atomique paquet doc:
Les effets de mémoire pour les accès et les mises à jour de atomics généralement de suivre les règles pour les substances volatiles:
get
a la mémoire des effets de la lecture d'unvolatile
variable.set
a la mémoire des effets de l'écriture (l'attribution)volatile
variable.
Par ailleurs, la doc du package est très bon et tout est expliqué...
lazySet
(introduit dans la version 6 de Java) est une nouvelle opération qui a introduit la sémantique irréalisable par volatile
variables; voir ce post pour plus d'informations.
JDK le code source est l'une des meilleures façons de réponses confusions de ce genre. Si vous regardez le code dans AtomicReference, il utilise un volatie variable pour objet de stockage.
private volatile V value;
Alors, évidemment, si vous allez seulement utiliser get() et set() sur AtomicReference c'est comme l'utilisation d'une variable volatile. Mais, comme d'autres lecteurs ont commenté, AtomicReference fournit d'autres CAS de la sémantique. Donc, d'abord décider si vous voulez disposer de la sémantique ou pas, et si vous n'avez qu'à utiliser ensuite AtomicReference.
AtomicReference fournit des fonctionnalités supplémentaires qu'une variable volatile non volatile ne fournit pas. Comme vous avez lu l'API, vous le saurez, mais cela fournit également un verrou qui peut être utile pour certaines opérations.
Cependant, à moins que vous n'ayez besoin de cette fonctionnalité supplémentaire, je vous suggère d'utiliser un champ volatil.