Параллелизм Java - класс AtomicLong

Класс java.util.concurrent.atomic.AtomicLong предоставляет операции с базовым длинным значением, которое может быть прочитано и записано атомарно, а также содержит расширенные атомарные операции. AtomicLong поддерживает атомарные операции с базовой переменной типа long. У него есть методы получения и установки, которые работают как чтение и запись для изменчивых переменных. То есть набор имеет отношение «происходит до» с любым последующим получением той же переменной. Атомарный метод compareAndSet также имеет эти функции согласованности памяти.

Методы AtomicLong

Ниже приводится список важных методов, доступных в классе AtomicLong.

Sr. No. Метод и описание
1

public long addAndGet(long delta)

Атомно добавляет данное значение к текущему значению.

2

public boolean compareAndSet(long expect, long update)

Атомарно устанавливает значение для данного обновленного значения, если текущее значение совпадает с ожидаемым значением.

3

public long decrementAndGet()

Атомарно уменьшает текущее значение на единицу.

4

public double doubleValue()

Возвращает значение указанного числа в виде двойного числа.

5

public float floatValue()

Возвращает значение указанного числа в виде числа с плавающей запятой.

6

public long get()

Получает текущее значение.

7

public long getAndAdd(long delta)

Атомарно добавляет заданное значение к текущему значению.

8

public long getAndDecrement()

Атомарно уменьшает текущее значение на единицу.

9

public long getAndIncrement()

Атомарно увеличивает текущее значение на единицу.

10

public long getAndSet(long newValue)

Атомно устанавливает данное значение и возвращает старое значение.

11

public long incrementAndGet()

Атомарно увеличивает текущее значение на единицу.

12

public int intValue()

Возвращает значение указанного числа как целое число.

13

public void lazySet(long newValue)

В конце концов устанавливается на заданное значение.

14

public long longValue()

Возвращает значение указанного числа в виде длинного числа.

15

public void set(long newValue)

Устанавливается на заданное значение.

16

public String toString()

Возвращает строковое представление текущего значения.

17

public boolean weakCompareAndSet(long expect, long update)

Атомарно устанавливает значение для данного обновленного значения, если текущее значение совпадает с ожидаемым значением.

пример

Следующая программа TestThread показывает безопасную реализацию счетчика с использованием AtomicLong в среде на основе потоков.

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

Это даст следующий результат.

Вывод

Final number (should be 1000): 1000