Concurrence Java - Classe AtomicBoolean

Une classe java.util.concurrent.atomic.AtomicBoolean fournit des opérations sur la valeur booléenne sous-jacente qui peuvent être lues et écrites de manière atomique, et contient également des opérations atomiques avancées. AtomicBoolean prend en charge les opérations atomiques sur la variable booléenne sous-jacente. Il a des méthodes get et set qui fonctionnent comme des lectures et des écritures sur des variables volatiles. Autrement dit, un ensemble a une relation qui se produit avant avec tout get ultérieur sur la même variable. La méthode atomic compareAndSet possède également ces fonctionnalités de cohérence de mémoire.

Méthodes AtomicBoolean

Voici la liste des méthodes importantes disponibles dans la classe AtomicBoolean.

N ° Sr. Méthode et description
1

public boolean compareAndSet(boolean expect, boolean update)

Définit atomiquement la valeur sur la valeur mise à jour donnée si la valeur actuelle == la valeur attendue.

2

public boolean get()

Renvoie la valeur actuelle.

3

public boolean getAndSet(boolean newValue)

Définit atomiquement la valeur donnée et renvoie la valeur précédente.

4

public void lazySet(boolean newValue)

Définit finalement la valeur donnée.

5

public void set(boolean newValue)

Définit inconditionnellement sur la valeur donnée.

6

public String toString()

Renvoie la représentation String de la valeur actuelle.

sept

public boolean weakCompareAndSet(boolean expect, boolean update)

Définit atomiquement la valeur sur la valeur mise à jour donnée si la valeur actuelle == la valeur attendue.

Exemple

Le programme TestThread suivant montre l'utilisation de la variable AtomicBoolean dans un environnement basé sur les threads.

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

Cela produira le résultat suivant.

Production

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!