Concurrence Java - Classe AtomicReference

Une classe java.util.concurrent.atomic.AtomicReference fournit des opérations sur la référence d'objet sous-jacente qui peuvent être lues et écrites de manière atomique, et contient également des opérations atomiques avancées. AtomicReference prend en charge les opérations atomiques sur la variable de référence d'objet sous-jacente. Il a des méthodes get et set qui fonctionnent comme des lectures et des écritures sur des variables volatiles. Autrement dit, un ensemble a une relation qui se produit avant avec tout get ultérieur sur la même variable. La méthode atomic compareAndSet possède également ces fonctionnalités de cohérence de mémoire.

Méthodes AtomicReference

Voici la liste des méthodes importantes disponibles dans la classe AtomicReference.

N ° Sr. Méthode et description
1

public boolean compareAndSet(V expect, V update)

Définit automatiquement la valeur sur la valeur mise à jour donnée si la valeur actuelle == la valeur attendue.

2

public boolean get()

Renvoie la valeur actuelle.

3

public boolean getAndSet(V newValue)

Définit atomiquement la valeur donnée et renvoie la valeur précédente.

4

public void lazySet(V newValue)

Définit finalement la valeur donnée.

5

public void set(V newValue)

Définit inconditionnellement sur la valeur donnée.

6

public String toString()

Renvoie la représentation String de la valeur actuelle.

sept

public boolean weakCompareAndSet(V expect, V update)

Définit automatiquement la valeur sur la valeur mise à jour donnée si la valeur actuelle == la valeur attendue.

Exemple

Le programme TestThread suivant montre l'utilisation de la variable AtomicReference dans un environnement basé sur les threads.

import java.util.concurrent.atomic.AtomicReference;

public class TestThread {
   private static String message = "hello";
   private static AtomicReference<String> atomicReference;

   public static void main(final String[] arguments) throws InterruptedException {
      atomicReference = new AtomicReference<String>(message);
      
      new Thread("Thread 1") {
         
         public void run() {
            atomicReference.compareAndSet(message, "Thread 1");
            message = message.concat("-Thread 1!");
         };
      }.start();

      System.out.println("Message is: " + message);
      System.out.println("Atomic Reference of Message is: " + atomicReference.get());
   }
}

Cela produira le résultat suivant.

Production

Message is: hello
Atomic Reference of Message is: Thread 1