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

Pouvons-nous rendre un tableau volatile en utilisant le mot-clé volatile en Java ?

Le modificateur volatile indique au JVM que les threads accédant à des variables volatile doivent toujours obtenir les données à partir de la mémoire. C'est-à-dire que les threads ne devraient pas mettre en cache les variables volatile.

Accéder à une variable volatile synchronise toutes les copies des variables en mémoire principale qui sont en cache. Les variables variables ne peuvent être appliquées qu'aux types d'objets ou aux variables d'instance privées. Une référence d'objet volatile peut être null.

Exemple

public class MyRunnable implements Runnable {
   private volatile boolean active;
   public void run() {
      active = true;
      while (active) { // line 1
         //Certaines lignes de code ici
      }
   }
   public void stop() {
      active = false; // line 2
   }
}

Rendre le tableau volatile

Même si nous déclarons le tableau comme volatile, les éléments du tableau n'ont pas de comportement volatile.

Pour résoudre ce problème, Java fournit deux classes, à savoir AtomicIntegerArray et AtomicLongArray, qui représentent des tableaux avec des enveloppes atomiques sur les variables (respectivement) ; les éléments de ces tableaux sont mis à jour automatiquement.

C'est-à-dire, les éléments de ces classes représentant les tableaux peuvent être accédés comme des variables volatiles. Ces classes fournissentget()etset()variables pour rechercher ou assigner des valeurs à chaque élément.

Étant donné que les wrappers atomiques peuvent être utilisés pour les types entiers et long, tandis que les autres types de données peuvent être utilisés, il est nécessaire de réaffecter la référence du tableau à chaque allocation d'élément dans le tableau.

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