Współbieżność języka Java - klasa AtomicIntegerArray

Klasa java.util.concurrent.atomic.AtomicIntegerArray zapewnia operacje na bazowej tablicy int, która może być odczytywana i zapisywana atomowo, a także zawiera zaawansowane operacje atomowe. AtomicIntegerArray obsługuje niepodzielne operacje na bazowej zmiennej tablicowej int. Posiada metody pobierania i ustawiania, które działają jak odczyty i zapisy na zmiennych nietrwałych. Oznacza to, że zestaw ma relację zdarzenie przed każdym kolejnym uzyskaniem tej samej zmiennej. Atomowa metoda compareAndSet również ma te funkcje spójności pamięci.

Metody AtomicIntegerArray

Poniżej znajduje się lista ważnych metod dostępnych w klasie AtomicIntegerArray.

Sr.No. Metoda i opis
1

public int addAndGet(int i, int delta)

Atomowo dodaje podaną wartość do elementu o indeksie i.

2

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

Atomowo ustawia element na pozycji i na podaną zaktualizowaną wartość, jeśli bieżąca wartość == oczekiwana wartość.

3

public int decrementAndGet(int i)

Atomowo zmniejsza o jeden element pod indeksem i.

4

public int get(int i)

Pobiera bieżącą wartość z pozycji i.

5

public int getAndAdd(int i, int delta)

Atomowo dodaje podaną wartość do elementu o indeksie i.

6

public int getAndDecrement(int i)

Atomowo zmniejsza o jeden element pod indeksem i.

7

public int getAndIncrement(int i)

Atomowo zwiększa o jeden element pod indeksem i.

8

public int getAndSet(int i, int newValue)

Atomowo ustawia element w pozycji i na podaną wartość i zwraca starą wartość.

9

public int incrementAndGet(int i)

Atomowo zwiększa o jeden element pod indeksem i.

10

public void lazySet(int i, int newValue)

Ostatecznie ustawia element w pozycji i na podaną wartość.

11

public int length()

Zwraca długość tablicy.

12

public void set(int i, int newValue)

Ustawia element w pozycji i na podaną wartość.

13

public String toString()

Zwraca ciąg znaków reprezentujący bieżące wartości tablicy.

14

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

Atomowo ustawia element na pozycji i na podaną zaktualizowaną wartość, jeśli bieżąca wartość == oczekiwana wartość.

Przykład

Poniższy program TestThread przedstawia użycie zmiennej AtomicIntegerArray w środowisku opartym na wątkach.

import java.util.concurrent.atomic.AtomicIntegerArray;

public class TestThread {
   private static AtomicIntegerArray atomicIntegerArray = new AtomicIntegerArray(10);

   public static void main(final String[] arguments) throws InterruptedException {
      
      for (int i = 0; i<atomicIntegerArray.length(); i++) {
         atomicIntegerArray.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<atomicIntegerArray.length(); i++) {
         System.out.print(atomicIntegerArray.get(i) + " ");
      }
   }

   static class Increment implements Runnable {

      public void run() {

         for(int i = 0; i<atomicIntegerArray.length(); i++) {
            int add = atomicIntegerArray.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<atomicIntegerArray.length(); i++) {
            boolean swapped = atomicIntegerArray.compareAndSet(i, 2, 3);
            
            if(swapped) {
               System.out.println("Thread " + Thread.currentThread().getId()
                  + ", index " +i + ", value: 3");
            }
         }
      }
   }
}

Spowoduje to następujący wynik.

Wynik

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