Concorrenza Java - AtomicLongArray Class

Una classe java.util.concurrent.atomic.AtomicLongArray fornisce operazioni sul long array sottostante che possono essere lette e scritte atomicamente e contiene anche operazioni atomiche avanzate. AtomicLongArray supporta operazioni atomiche sulla variabile long array sottostante. Ha metodi get e set che funzionano come letture e scritture su variabili volatili. Cioè, un insieme ha una relazione accade prima con qualsiasi successivo get sulla stessa variabile. Anche il metodo compareAndSet atomico ha queste caratteristiche di coerenza della memoria.

Metodi AtomicLongArray

Di seguito è riportato l'elenco dei metodi importanti disponibili nella classe AtomicLongArray.

Sr.No. Metodo e descrizione
1

public long addAndGet(int i, long delta)

Atomicamente aggiunge il valore dato all'elemento all'indice i.

2

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

Atomicamente imposta l'elemento nella posizione i al valore aggiornato dato se il valore corrente == il valore atteso.

3

public long decrementAndGet(int i)

Atomicamente decrementa di uno l'elemento all'indice i.

4

public long get(int i)

Ottiene il valore corrente nella posizione i.

5

public long getAndAdd(int i, long delta)

Atomicamente aggiunge il valore dato all'elemento all'indice i.

6

public long getAndDecrement(int i)

Atomicamente decrementa di uno l'elemento all'indice i.

7

public long getAndIncrement(int i)

Atomicamente incrementa di uno l'elemento all'indice i.

8

public long getAndSet(int i, long newValue)

Atomicamente imposta l'elemento nella posizione i al valore dato e restituisce il vecchio valore.

9

public long incrementAndGet(int i)

Atomicamente incrementa di uno l'elemento all'indice i.

10

public void lazySet(int i, long newValue)

Alla fine imposta l'elemento in posizione i al valore dato.

11

public int length()

Restituisce la lunghezza della matrice.

12

public void set(int i, long newValue)

Imposta l'elemento in posizione i sul valore dato.

13

public String toString()

Restituisce la rappresentazione String dei valori correnti di array.

14

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

Atomicamente imposta l'elemento nella posizione i al valore aggiornato dato se il valore corrente == il valore atteso.

Esempio

Il seguente programma TestThread mostra l'utilizzo della variabile AtomicIntegerArray in un ambiente basato su thread.

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");
            }
         }
      }
   }
}

Questo produrrà il seguente risultato.

Produzione

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