Maison  >  Article  >  Java  >  AtomicBoolean de la classe Atomic en Java

AtomicBoolean de la classe Atomic en Java

(*-*)浩
(*-*)浩avant
2019-10-15 17:01:352685parcourir

AtomicBoolean de la classe Atomic en Java

Classe

Sous le package java.util.concurrent.atomic, il y a AtomicBoolean, AtomicInteger, AtomicLong, AtomicReference et d'autres classes, leurs de base La caractéristique est que dans un environnement multithread, lors de l'exécution des méthodes contenues dans ces instances de classe, elle est exclusive, c'est-à-dire que lorsqu'un thread entre dans la méthode et exécute les instructions qu'elle contient, il ne sera pas interrompu par d'autres threads. , et les autres threads tourneront simplement. De la même manière que le verrou, il attend que la méthode soit terminée avant que la JVM sélectionne un autre thread dans la file d'attente pour y entrer.

Exemple

Prenons AtomicBoolean comme exemple Si un seul thread exécute une méthode ordinaire (comme suit), il n'y aura pas de problème de thread :

package com.secbro.test.atomic;

/**
 * @author zhuzhisheng
 * @Description
 * @date on 2016/5/26.
 */
public class NormalBoolean implements Runnable{

    public static boolean exits = false;

    private String name;

    public NormalBoolean(String name){
        this.name = name;
    }


    @Override
    public void run() {
        if(!exits){
            exits = true;
            System.out.println(name + ",step 1");
            System.out.println(name + ",step 2");
            System.out.println(name + ",step 3");
            exits = false;
        } else {
            System.out.println(name + ",step else");
        }
    }

    public static void main(String[] args) {
        new NormalBoolean("张三").run();
    }
}
<.>Cependant, lors d'une exécution multithread, lorsque la commande après le jugement est exécutée, d'autres threads inséreront et modifieront la valeur des sorties. Par exemple, l'extrait de code suivant :

package com.secbro.test.atomic;
/**
 * @author zhuzhisheng
 * @Description
 * @date on 2016/5/26.
 */
public class NormalBoolean2 implements Runnable{
    public static boolean exits = false;
    private String name;
    public NormalBoolean2(String name) {
        this.name = name;
    }
    @Override
    public void run() {
        if(!exits){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            exits = true;
            System.out.println(name + ",step 1");
            System.out.println(name + ",step 2");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(name + ",step 3");
            exits = false;
        } else {
            System.out.println(name + ",step else");
        }
    }
}

Exécutez deux threads en même temps, et le résultat imprimé est :

张三,step 1
李四,step 1
张三,step 2
李四,step 2
张三,step 3
李四,step 3

Désormais, l'utilisation d'AtomicBoolean peut garantir un fonctionnement sûr dans des situations multithread, et un seul thread est utilisé pour le traitement métier.

package com.secbro.test.atomic;

import java.util.concurrent.atomic.AtomicBoolean;

/**
 * @author zhuzhisheng
 * @Description
 * @date on 2016/5/26.
 */
public class TestAtomicBoolean implements Runnable{

    public static AtomicBoolean exits = new AtomicBoolean(false);

    private String name;

    public TestAtomicBoolean(String name) {
        this.name = name;
    }

    @Override
    public void run() {

        if(exits.compareAndSet(false,true)){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(name + ",step 1");

            System.out.println(name + ",step 2");

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(name + ",step 3");
            exits.set(false);
        } else {
            System.out.println(name + ",step else");
        }

    }
}

Lorsque deux threads exécutent cette classe, le résultat imprimé est le suivant :

张三,step else
李四,step 1
李四,step 2
李四,step 3

Classe de test :

package com.secbro.test.atomic;
/**
 * @author zhuzhisheng
 * @Description
 * @date on 2016/5/26.
 */
public class TestBoolean {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new NormalBoolean2("李四"));
        Thread thread2 = new Thread(new NormalBoolean2("张三"));
        thread1.start();
        thread2.start();
        //-------------------------------------------------------
        Thread thread3 = new Thread(new TestAtomicBoolean("李四"));
        Thread thread4 = new Thread(new TestAtomicBoolean("张三"));
        thread3.start();
        thread4.start();
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer