Concurrence Java - Classe AtomicLongArray

Une classe java.util.concurrent.atomic.AtomicLongArray fournit des opérations sur le long tableau sous-jacent qui peuvent être lues et écrites de manière atomique, et contient également des opérations atomiques avancées. AtomicLongArray prend en charge les opérations atomiques sur la variable de tableau long 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 AtomicLongArray

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

Sr.No. Méthode et description
1

public long addAndGet(int i, long delta)

Ajoute atomiquement la valeur donnée à l'élément à l'index i.

2

public boolean compareAndSet(int i, long expect, long update)

Définit atomiquement l'élément à la position i à la valeur mise à jour donnée si la valeur actuelle == la valeur attendue.

3

public long decrementAndGet(int i)

Décrémente atomiquement de un l'élément à l'index i.

4

public long get(int i)

Obtient la valeur actuelle à la position i.

5

public long getAndAdd(int i, long delta)

Ajoute atomiquement la valeur donnée à l'élément à l'index i.

6

public long getAndDecrement(int i)

Décrémente atomiquement de un l'élément à l'index i.

sept

public long getAndIncrement(int i)

Incrémente atomiquement de un l'élément à l'index i.

8

public long getAndSet(int i, long newValue)

Définit atomiquement l'élément à la position i à la valeur donnée et renvoie l'ancienne valeur.

9

public long incrementAndGet(int i)

Incrémente atomiquement de un l'élément à l'index i.

dix

public void lazySet(int i, long newValue)

Définit finalement l'élément à la position i à la valeur donnée.

11

public int length()

Renvoie la longueur du tableau.

12

public void set(int i, long newValue)

Définit l'élément à la position i à la valeur donnée.

13

public String toString()

Renvoie la représentation String des valeurs actuelles du tableau.

14

public boolean weakCompareAndSet(int i, long expect, long update)

Définit atomiquement l'élément à la position i à la valeur mise à jour donnée si la valeur actuelle == la valeur attendue.

Exemple

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

import java.util.concurrent.atomic.AtomicLongArray;

public class TestThread {
   private static AtomicLongArray atomicLongArray = new AtomicLongArray(10);

   public static void main(final String[] arguments) throws InterruptedException {

      for (int i = 0; i<atomicLongArray.length(); i++) {
         atomicLongArray.set(i, 1);
      }

      Thread t1 = new Thread(new Increment());
      Thread t2 = new Thread(new Compare());
      t1.start();
      t2.start();

      t1.join();
      t2.join();

      System.out.println("Values: ");
      
      for (int i = 0; i<atomicLongArray.length(); i++) {
         System.out.print(atomicLongArray.get(i) + " ");
      }
   }  

   static class Increment implements Runnable {

      public void run() {

         for(int i = 0; i<atomicLongArray.length(); i++) {
            long add = atomicLongArray.incrementAndGet(i);
            System.out.println("Thread " + Thread.currentThread().getId() 
               + ", index " +i + ", value: "+ add);
         }
      }
   }

   static class Compare implements Runnable {

      public void run() {

         for(int i = 0; i<atomicLongArray.length(); i++) {
            boolean swapped = atomicLongArray.compareAndSet(i, 2, 3);
            
            if(swapped) {
               System.out.println("Thread " + Thread.currentThread().getId()
                  + ", index " +i + ", value: 3");
            }
         }
      }
   }
}

Cela produira le résultat suivant.

Production

Thread 9, index 0, value: 2
Thread 10, index 0, value: 3
Thread 9, index 1, value: 2
Thread 9, index 2, value: 2
Thread 9, index 3, value: 2
Thread 9, index 4, value: 2
Thread 10, index 1, value: 3
Thread 9, index 5, value: 2
Thread 10, index 2, value: 3
Thread 9, index 6, value: 2
Thread 10, index 3, value: 3
Thread 9, index 7, value: 2
Thread 10, index 4, value: 3
Thread 9, index 8, value: 2
Thread 9, index 9, value: 2
Thread 10, index 5, value: 3
Thread 10, index 6, value: 3
Thread 10, index 7, value: 3
Thread 10, index 8, value: 3
Thread 10, index 9, value: 3
Values: 
3 3 3 3 3 3 3 3 3 3