Java Concurrency - AtomicInteger-Klasse

Eine java.util.concurrent.atomic.AtomicInteger-Klasse bietet Operationen für den zugrunde liegenden int-Wert, die atomar gelesen und geschrieben werden können, und enthält auch erweiterte atomare Operationen. AtomicInteger unterstützt atomare Operationen für die zugrunde liegende int-Variable. Es verfügt über Methoden zum Abrufen und Festlegen, die wie das Lesen und Schreiben flüchtiger Variablen funktionieren. Das heißt, eine Menge hat eine Vorher-Beziehung zu einem nachfolgenden Abruf derselben Variablen. Die atomare compareAndSet-Methode verfügt auch über diese Speicherkonsistenzfunktionen.

AtomicInteger-Methoden

Im Folgenden finden Sie eine Liste wichtiger Methoden, die in der AtomicInteger-Klasse verfügbar sind.

Sr.Nr. Methode & Beschreibung
1

public int addAndGet(int delta)

Addiert atomar den angegebenen Wert zum aktuellen Wert.

2

public boolean compareAndSet(int expect, int update)

Setzt den Wert atomar auf den angegebenen aktualisierten Wert, wenn der aktuelle Wert dem erwarteten Wert entspricht.

3

public int decrementAndGet()

Verringert den aktuellen Wert atomar um eins.

4

public double doubleValue()

Gibt den Wert der angegebenen Zahl als Double zurück.

5

public float floatValue()

Gibt den Wert der angegebenen Zahl als Float zurück.

6

public int get()

Ruft den aktuellen Wert ab.

7

public int getAndAdd(int delta)

Atomiclly addiert den angegebenen Wert zum aktuellen Wert.

8

public int getAndDecrement()

Verringert den aktuellen Wert atomar um eins.

9

public int getAndIncrement()

Erhöht den aktuellen Wert atomar um eins.

10

public int getAndSet(int newValue)

Setzt atomar auf den angegebenen Wert und gibt den alten Wert zurück.

11

public int incrementAndGet()

Erhöht den aktuellen Wert atomar um eins.

12

public int intValue()

Gibt den Wert der angegebenen Zahl als int zurück.

13

public void lazySet(int newValue)

Setzt schließlich auf den angegebenen Wert.

14

public long longValue()

Gibt den Wert der angegebenen Zahl als long zurück.

15

public void set(int newValue)

Setzt auf den angegebenen Wert.

16

public String toString()

Gibt die String-Darstellung des aktuellen Werts zurück.

17

public boolean weakCompareAndSet(int expect, int update)

Setzt den Wert atomar auf den angegebenen aktualisierten Wert, wenn der aktuelle Wert dem erwarteten Wert entspricht.

Beispiel

Das folgende TestThread-Programm zeigt eine unsichere Implementierung des Zählers in einer threadbasierten Umgebung.

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

Dies kann abhängig von der Geschwindigkeit des Computers und der Thread-Verschachtelung zu folgendem Ergebnis führen.

Ausgabe

Final number (should be 1000): 1000

Beispiel

Das folgende TestThread-Programm zeigt eine sichere Implementierung des Zählers mithilfe von AtomicInteger in einer threadbasierten Umgebung.

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

Dies führt zu folgendem Ergebnis.

Ausgabe

Final number (should be 1000): 1000