2011-03-02 22 views
11

¿Cómo puedo hacer que una matriz sea volátil? Porque, como he llegado a entender, ¿no es seguro hacer una matriz volátil?matriz volátil Java?

+2

http: //jeremymanson.blogspot.com/2009/06/volatile-arrays-in-java.html –

Respuesta

13

Declarar una matriz volátil NO otorga acceso volátil a sus campos. estás declarando que la referencia en sí misma es volátil, no sus elementos.

En otras palabras, está declarando un conjunto volátil de elementos, no un conjunto de elementos volátiles. La solución aquí es usar AtomicIntegerArray en caso de que quiera usar enteros. Otra forma (pero un poco feo) es volver a escribir la referencia a la matriz cada vez que se edita un campo

lo haces por

arr = arr; 

(como ya he dicho ... feo)

+2

No creo que los elementos sean volátiles es lo mismo que el acceso de los elementos a atómico. – Blindy

+0

Tiene razón, 'volátil' se trata de garantizar la relación de pasar antes. – mike

6

AtomicLongArray, AtomicIntegerArray, AtomicReferenceArray (java.util.concurrent.atomic).

1

EDITAR: matrices objetos en java. si hace que la referencia a ese objeto sea volátil, la hace visible para otros hilos si cambia la referencia a la matriz. Sin embargo, esto no es válido para los valores de la matriz.

Obteniendo un mejor conocimiento del modelo de memoria Java, existe la posibilidad de evitarlo sin una matriz Atomic *. Utilizando la relación sucedido antes de volátiles lecturas y escrituras normales hace que sea posible:

si el hilo A escribe un poco de materia no volátil y una variable volátil después que, hilo B está garantizado para ver los cambios de la materia volátil también, pero solo si el hilo B lee primero la variable volátil. ver también: Happens-before relationships with volatile fields and synchronized blocks in Java - and their impact on non-volatile variables?

Para matrices, esto significa: Después de escribir a la matriz, escriba a alguna variable de estado volátil (asegúrese de que la escritura de hecho cambia la variable de estado volátil!) Cuando se lee a partir de la matriz , lea primero la variable de estado volátil y luego acceda a la matriz. La lectura volátil debe hacer que todas las demás escrituras también sean visibles, siempre que ocurran antes.

ANTIGUO: escribiendo la auto referencia arr=arr en realidad no ayudaría.

Escriba la dirección de la matriz arr, no el valor del campo arr[i]. Por lo tanto, aún no obtiene propiedades volátiles para arr[i] (que desee), pero solo para la dirección de almacenamiento arr.

La entrada de blog se ha mencionado anteriormente de Jeremy Manson explica en detalle: http://jeremymanson.blogspot.com/2009/06/volatile-arrays-in-java.html

Su mejor solución es utilizar Atómica * matrices, a saber, la AtomicReferenceArray de tipos genéricos (también existen formas especiales para los tipos básicos). No puedo imaginar que esto sea particularmente eficiente, especialmente porque te permite obtener más propiedades que las que necesitas (atomicidad >> volátil).

Una alternativa pueden ser las estructuras de pointer donde los contenedores usan campos de punteros volátiles. También no es tan eficiente ...