English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

¿Podemos hacer que volatile sea un array usando la palabra clave volatile en Java?

El modificador volatile indica a la JVM que el hilo que accede a variables volátiles siempre debe obtener los datos desde la memoria. Es decir, el hilo no debe cachear variables volátiles.

El acceso a variables volátiles sincroniza todas las copias de variables en caché en la memoria principal. Las variables variables solo se pueden aplicar a tipos de objetos o instancias de variables privadas. La referencia de objeto volátil puede ser null.

Ejemplo

public class MyRunnable implements Runnable {
   private volatile boolean active;
   public void run() {
      active = true;
      while (active) { // line 1
         //Algunos códigos aquí
      }
   }
   public void stop() {
      active = false; // line 2
   }
}

Hacer que el array sea volátil

A pesar de que declaramos el array como volatile, los elementos del array no tienen comportamiento volatile.

Para resolver este problema, Java proporciona dos clases, es decir, AtomicIntegerArray y AtomicLongArray, que representan arreglos con envolturas atómicas en (cada) variable, cuyos elementos se actualizan automáticamente.

Es decir, se puede acceder a los elementos de los arrays representados por estas clases como variables volátiles. Estas clases proporcionanget()yset()variables para recuperar o asignar valores a cada elemento.

Dado que los paquetes atómicos se pueden usar para tipos de datos enteros y long, y los demás tipos de datos están disponibles, se necesita reasignar el valor de la referencia del array cada vez que se asigna un elemento al array.

volatile int[] myArray = new int[3];
myArray [0] = 100;
myArray = myArray;
myArray [1] = 50;
myArray = myArray;
myArray [2] = 150;
myArray = myArray;