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

Possiamo rendere un array volatile utilizzando la parola chiave volatile in Java?

Il modificatore volatile indica al JVM che i thread che accedono a variabili volatile devono sempre ottenere i dati dalla memoria. Ciò significa che i thread non dovrebbero cache variabili volatile.

L'accesso a variabili volatile sincronizza tutte le copie dei variabili nella cache della memoria principale. Le variabili mutabili possono essere applicate solo a tipi di oggetto o a variabili di istanza private. Il riferimento all'oggetto volatile può essere null.

Esempio

public class MyRunnable implements Runnable {
   private volatile boolean active;
   public void run() {
      active = true;
      while (active) { // riga 1
         // Alcuni codici qui
      }
   }
   public void stop() {
      active = false; // riga 2
   }
}

Respingere l'array volatile

Nonostante dichiariamo l'array come volatile, gli elementi dell'array non presentano comportamento volatile.

Per risolvere questo problema, Java fornisce due classi, ovvero AtomicIntegerArray e AtomicLongArray, che rappresentano array con wrapper atomici su variabili (rispettivamente) e i cui elementi vengono aggiornati automaticamente.

Questo significa che è possibile accedere agli elementi di un array rappresentato da queste classi come variabili mutabili. Queste classi fornisconoget()e}}set()Variabili per recuperare o assegnare valori a ciascun elemento.

Poiché i wrapper atomici sono disponibili per i tipi di dati interi e long, mentre gli altri tipi di dati sono disponibili, è necessario riassegnare il riferimento dell'array ogni volta che si assegna un elemento all'array.

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