2010-02-10 13 views
31

Existe-t-il un moyen de déclarer les éléments de tableau volatile en Java? C'est à dire.Comment déclarer les éléments du tableau volatils en Java?

volatile int[] a = new int[10]; 

déclare la référence de tableau volatile, mais les éléments de réseau (par exemple a[1]) ne sont toujours pas volatile. Donc, je cherche quelque chose comme

volatile int[] a = new volatile int[10]; 

mais cela ne fonctionne pas de cette façon. Est-ce possible?

+0

@Kanagavelu Sugumar: AtomicReference _is_ enveloppé 'volatile', avec quelques méthodes supplémentaires (getAndSet etc.). –

Répondre

27

utilisation AtomicIntegerArray ou AtomicLongArray ou AtomicReferenceArray

La classe AtomicIntegerArray met en oeuvre un réseau d'int dont les champs individuels sont accessibles avec une sémantique volatils, par l'intermédiaire d'get() et set() les méthodes de la classe. Appeler arr.set(x, y) à partir d'un thread garantira alors qu'un autre thread appelant arr.get(x) lira la valeur y (jusqu'à ce qu'une autre valeur soit lue à la position x).

Voir:

+0

Je me demande pourquoi il y a 'AtomicArrays' spécifique pour int et long, mais pas pour les autres types primitifs ... Mais bien sûr le reste des primitives pourrait être truqué en utilisant leurs wrappers dans un' AtomicReferenceArray'. –

+0

Je pense que AtomicIntegerArray et AtomicLongArray sont optimisés pour fonctionner avec entier et long respectivement. – uthark

+4

@JoonasPulakka pour d'autres types primitifs, vous pouvez également les convertir en int ou long en utilisant par ex. 'Float.floatToIntBits (float)'. Cela évite le besoin de boxer lors de l'utilisation de 'AtomicReferenceArray'. –

6

Non, vous ne pouvez pas faire les éléments du tableau volatile. Voir aussi http://jeremymanson.blogspot.com/2009/06/volatile-arrays-in-java.html.

+0

En fait vous pouvez, mais avec des efforts supplémentaires. – uthark

+0

Techniquement, cela ne rend pas toujours les éléments volatils, mais les opérations de tableau sont volatiles. Puisque 'int 'pour ce cas est une primitive, il a essentiellement le même comportement, mais cela ne peut pas être facilement étendu pour les tableaux non primitifs. – Marcus