Учебники

Параллелизм Java – класс AtomicInteger

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

Методы AtomicInteger

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

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

public int addAndGet (int delta)

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

2

public boolean compareAndSet (ожидаемое int, обновление int)

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

3

public int decmentAndGet ()

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

4

public double doubleValue ()

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

5

публичный float floatValue ()

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

6

public int get ()

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

7

public int getAndAdd (int delta)

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

8

public int getAndDecrement ()

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

9

public int getAndIncrement ()

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

10

public int getAndSet (int newValue)

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

11

public int incrementAndGet ()

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

12

public int intValue ()

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

13

public void lazySet (int newValue)

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

14

public long longValue ()

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

15

открытый набор void (int newValue)

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

16

public String toString ()

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

17

public boolean weakCompareAndSet (ожидаемое, обновление int)

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

public int addAndGet (int delta)

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

public boolean compareAndSet (ожидаемое int, обновление int)

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

public int decmentAndGet ()

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

public double doubleValue ()

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

публичный float floatValue ()

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

public int get ()

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

public int getAndAdd (int delta)

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

public int getAndDecrement ()

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

public int getAndIncrement ()

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

public int getAndSet (int newValue)

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

public int incrementAndGet ()

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

public int intValue ()

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

public void lazySet (int newValue)

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

public long longValue ()

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

открытый набор void (int newValue)

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

public String toString ()

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

public boolean weakCompareAndSet (ожидаемое, обновление int)

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

пример

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

Live Demo

public class TestThread {

   static class Counter {
      private int c = 0;

      public void increment() {
         c++;
      }

      public int value() {
         return c;
      }
   }
   
   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

пример

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

Live Demo

import java.util.concurrent.atomic.AtomicInteger;

public class TestThread {

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

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

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

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