Współbieżność Java - klasa AtomicLong

Klasa java.util.concurrent.atomic.AtomicLong udostępnia operacje na bazowych długich wartościach, które mogą być odczytywane i zapisywane atomowo, a także zawiera zaawansowane operacje atomowe. AtomicLong obsługuje niepodzielne operacje na bazowej zmiennej długiej. 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 AtomicLong

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

Sr.No. Metoda i opis
1

public long addAndGet(long delta)

Atomowo dodaje podaną wartość do bieżącej wartości.

2

public boolean compareAndSet(long expect, long update)

Atomowo ustawia wartość na podaną zaktualizowaną wartość, jeśli bieżąca wartość jest taka sama jak wartość oczekiwana.

3

public long decrementAndGet()

Zmniejsza atomowo bieżącą wartość o jeden.

4

public double doubleValue()

Zwraca wartość określonej liczby jako podwójną.

5

public float floatValue()

Zwraca wartość określonej liczby jako liczbę zmiennoprzecinkową.

6

public long get()

Pobiera bieżącą wartość.

7

public long getAndAdd(long delta)

Atomiclly dodaje podaną wartość do bieżącej wartości.

8

public long getAndDecrement()

Zmniejsza atomowo bieżącą wartość o jeden.

9

public long getAndIncrement()

Zwiększa atomowo bieżącą wartość o jeden.

10

public long getAndSet(long newValue)

Atomowo ustawia podaną wartość i zwraca starą wartość.

11

public long incrementAndGet()

Zwiększa atomowo bieżącą wartość o jeden.

12

public int intValue()

Zwraca wartość określonej liczby jako liczbę całkowitą.

13

public void lazySet(long newValue)

Ostatecznie ustawia się na podaną wartość.

14

public long longValue()

Zwraca wartość określonej liczby w postaci długości.

15

public void set(long newValue)

Ustawia podaną wartość.

16

public String toString()

Zwraca ciąg znaków reprezentujący bieżącą wartość.

17

public boolean weakCompareAndSet(long expect, long update)

Atomowo ustawia wartość na podaną zaktualizowaną wartość, jeśli bieżąca wartość jest taka sama jak wartość oczekiwana.

Przykład

Poniższy program TestThread przedstawia bezpieczną implementację licznika przy użyciu AtomicLong w środowisku opartym na wątkach.

import java.util.concurrent.atomic.AtomicLong;

public class TestThread {

   static class Counter {
      private AtomicLong c = new AtomicLong(0);

      public void increment() {
         c.getAndIncrement();
      }

      public long value() {
         return c.get();
      }
   }

   public static void main(final String[] arguments) throws InterruptedException {
      final Counter counter = new Counter();
      
      //1000 threads
      for(int i = 0; i < 1000 ; i++) {
         
         new Thread(new Runnable() {
            
            public void run() {
               counter.increment();
            }
         }).start();	
      }
      Thread.sleep(6000);			   		  
      System.out.println("Final number (should be 1000): " + counter.value());
   }
}

Spowoduje to następujący wynik.

Wynik

Final number (should be 1000): 1000