Java Concurrency - AtomicBoolean-Klasse

Eine java.util.concurrent.atomic.AtomicBoolean-Klasse bietet Operationen für den zugrunde liegenden booleschen Wert, die atomar gelesen und geschrieben werden können, und enthält auch erweiterte atomare Operationen. AtomicBoolean unterstützt atomare Operationen für zugrunde liegende boolesche Variablen. 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.

AtomicBoolean-Methoden

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

Sr.Nr. Methode & Beschreibung
1

public boolean compareAndSet(boolean expect, boolean update)

Setzt den Wert atomar auf den angegebenen aktualisierten Wert, wenn der aktuelle Wert == der erwartete Wert ist.

2

public boolean get()

Gibt den aktuellen Wert zurück.

3

public boolean getAndSet(boolean newValue)

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

4

public void lazySet(boolean newValue)

Setzt schließlich auf den angegebenen Wert.

5

public void set(boolean newValue)

Wird unbedingt auf den angegebenen Wert gesetzt.

6

public String toString()

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

7

public boolean weakCompareAndSet(boolean expect, boolean update)

Setzt den Wert atomar auf den angegebenen aktualisierten Wert, wenn der aktuelle Wert == der erwartete Wert ist.

Beispiel

Das folgende TestThread-Programm zeigt die Verwendung der AtomicBoolean-Variablen in einer threadbasierten Umgebung.

import java.util.concurrent.atomic.AtomicBoolean;

public class TestThread {

   public static void main(final String[] arguments) throws InterruptedException {
      final AtomicBoolean atomicBoolean = new AtomicBoolean(false);

      new Thread("Thread 1") {

         public void run() {

            while(true) {
               System.out.println(Thread.currentThread().getName() 
                  +" Waiting for Thread 2 to set Atomic variable to true. Current value is "
                  + atomicBoolean.get());

               if(atomicBoolean.compareAndSet(true, false)) {
                  System.out.println("Done!");
                  break;
               }
            }
         };
      }.start();

      new Thread("Thread 2") {

         public void run() {
            System.out.println(Thread.currentThread().getName() +
               ", Atomic Variable: " +atomicBoolean.get()); 
            System.out.println(Thread.currentThread().getName() +
               " is setting the variable to true ");
            atomicBoolean.set(true);
            System.out.println(Thread.currentThread().getName() +
               ", Atomic Variable: " +atomicBoolean.get()); 
         };
      }.start();
   }
}

Dies führt zu folgendem Ergebnis.

Ausgabe

Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 2, Atomic Variable: false
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 2 is setting the variable to true
Thread 2, Atomic Variable: true
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Done!