157 votes

Référence volatile Java vs AtomicReference

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 ?

131voto

pgras Points 7202

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'un volatile 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.

53voto

Avi Points 14468

Non, il n'y en a pas.

La puissance supplémentaire fournie par AtomicReference est la méthode compareAndSet () et ses amis. Si vous n'avez pas besoin de ces méthodes, une référence volatile fournit la même sémantique qu'AtomicReference.set () et .get ().

9voto

endless Points 329

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.

4voto

Peter Lawrey Points 229686

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X