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