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

AtomicBoolean de la classe Atomic en Java

(*-*)浩
Libérer: 2019-10-15 17:01:35
avant
2781 Les gens l'ont consulté

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();
    }
}
Copier après la connexion
<. 🎜>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");
        }
    }
}
Copier après la connexion

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
Copier après la connexion

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

    }
}
Copier après la connexion

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

张三,step else
李四,step 1
李四,step 2
李四,step 3
Copier après la connexion

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();
    }
}
Copier après la connexion

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!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal