2010-02-10 9 views
31

¿Hay alguna manera de declarar los elementos de la matriz volatile en Java? Es decir.¿Cómo declarar elementos de matriz volátiles en Java?

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

declara la referencia arrayvolatile, pero los elementos de la matriz (por ejemplo a[1]) todavía no son volátiles. Así que estoy buscando algo como

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

pero no funciona de esa manera. ¿Es posible?

+0

@Kanagavelu Sugumar: AtomicReference _is_ a wrapped 'volátil', con algunos métodos adicionales (getAndSet etc.). –

Respuesta

27

Uso AtomicIntegerArray o AtomicLongArray o AtomicReferenceArray

La clase AtomicIntegerArray implementa una matriz int cuyos campos individuales se puede acceder con la semántica volátiles, a través de get() y set() métodos de la clase. Llamar a arr.set(x, y) desde un hilo garantizará que otro hilo que llame al arr.get(x) leerá el valor y (hasta que se lea otro valor en la posición x).

Ver:

+0

Me pregunto por qué hay 'AtomicArrays' específicas para int y long, pero no para otros tipos primitivos ... Pero, por supuesto, el resto de las primitivas podrían ser falsificadas usando sus wrappers en un' AtomicReferenceArray'. –

+0

Creo que AtomicIntegerArray y AtomicLongArray están optimizados para trabajar con enteros y largos respectivamente. – uthark

+4

@JoonasPulakka para otros tipos primitivos también puede convertirlos a int o long usando, p. Ej. 'Float.floatToIntBits (float)'. Esto evita la necesidad de boxeo cuando se usa 'AtomicReferenceArray'. –

6

No, usted no puede hacer que los elementos de matriz volátil. Vea también http://jeremymanson.blogspot.com/2009/06/volatile-arrays-in-java.html.

+0

En realidad puedes, pero con esfuerzos adicionales. – uthark

+0

Técnicamente eso todavía no hace que los elementos sean volátiles, pero las operaciones de matriz son volátiles. Dado que 'int' para este caso es una primitiva, esencialmente tiene el mismo comportamiento, pero esto no podría extenderse fácilmente para matrices no primitivas. – Marcus

Cuestiones relacionadas